应用程序经常要对磁盘做操作,如拷贝文件,读取文件,列举磁盘之类的。
在读取文件时会遇到有些移动盘被写保护的情况,通常处理的方式是在对应盘里写个文件判断是否成功,为了跳过系统弹框用SetErrorMode设置一下
如下代码:
#include <iostream>
#include <fstream>
BOOL IsDeviceProtected(char Drive)
{
BOOL rst = true;
UINT Mode = SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS;
Mode = SetErrorMode(Mode); //这样设置之后,就不会弹出错误信息了
char buf[] = "?:\\ASS.adst"; buf[0] = Drive;
std::ofstream ofs(buf);
if (ofs)
{
rst = true;
remove(buf);
ofs.close();
}
SetErrorMode(Mode); //恢复之前的错误模式
return rst;
}
如果是损坏的u盘被写保护,其实还可以根据其特性进行操作。因为损坏的磁盘其文件虽然可以读取,但其文件熟悉,文件名称有可能被破坏,因此可以如此:
#include <io.h>
#include <stdio.h>
BOOL IsDeviceProtected(char Drive)
{
BOOL rst = true;
char buf[] = "?:\\*.*";
buf[0] = Drive;
_finddata_t fd;
intptr_t pf = _findfirst(buf, &fd);
if (pf != -1)
{
do
{
if (fd.time_access == -1 || fd.time_create == -1 || fd.time_write == -1) //校验时间属性 还可以校验文件属性
{
rst = false;
break;
}
printf("%s\n", fd.name);
} while (!_findnext(pf, &fd));
_findclose(pf);
}
else
rst = false;
return rst;
}
参考:http://bbs.csdn.net/topics/50460388