判断磁盘/U盘 是否 被写保护

时间:2021-01-10 05:52:44

   应用程序经常要对磁盘做操作,如拷贝文件,读取文件,列举磁盘之类的。

   在读取文件时会遇到有些移动盘被写保护的情况,通常处理的方式是在对应盘里写个文件判断是否成功,为了跳过系统弹框用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