用win32 API判断是否能够读取某分区的内容

某分区即使分配了盘符也可能无法打开/读取(比如插入一个没有卡的读卡器)

除了试着读取,判断返回值之类的方法外,我想知道如何判断此分区是否可读。

阅读 4.7k
1 个回答
bool IsAccessible(TCHAR *pstr)
{
   TCHAR str[260];
   _tcscpy(str,pstr);
   if(str[_tcslen(str)-1]!='\\')
       _tcscat(str,_T("\\*"));
   else
        _tcscat(str,_T("*"));
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;   
    hFind = FindFirstFile(pstr, &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE || GetLastError()==ERROR_FILE_NOT_FOUND) 
   {
      //printf ("driver is unable to access!");
      return false;
   }
   CloseHandle(hFind);
    return true;
} 

很简单你访问一次之后看访问是否成功即可。


感谢楼主,上面的方法不是很成功,原因是在读取磁盘根目录的时候,FindFirstFile是不会返回"."和"..",而是直接返回INVALID_HANDLE_VALUE。
下面的代码是通过访问磁盘来获取磁盘的大小,这个函数调用失败后表面不存在磁盘。

bool isAccess(TCHAR *pstr)
{
    ULARGE_INTEGER nFreeBytesAvailable;
        ULARGE_INTEGER nTotalNumberOfBytes;
        ULARGE_INTEGER nTotalNumberOfFreeBytes;
        //
        if (GetDiskFreeSpaceEx(pstr,
              &nFreeBytesAvailable,
              &nTotalNumberOfBytes,
              &nTotalNumberOfFreeBytes))
        {
            return true;     
       }
    return false;
}

实验使用光驱来做实验,实验表明这种方法可行,不过在光驱里没有盘片的时候,会弹出如下的对话框:
光盘访问失败对话框

这个问题的解决还没有想好。可以用FindWindow然后杀掉。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进