2012-11-13 17 views
2

我對以下情況感到困惑。 我的應用程序試圖找到一個指定的目錄:無法訪問由CreateDirectory創建的目錄

HANDLE   _dh, _fh;  // Handles for a files 
_dh = CreateFile(_ddn , GENERIC_READ , FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_DIRECTORY , NULL); 

如果目錄不存在應用程序創建它:

if(_dh == INVALID_HANDLE_VALUE) { 
     if(GetLastError() == ERROR_FILE_NOT_FOUND){ 
      CreateDirectory(_ddn , NULL); } 
     else { 
      CStringW _err; 
      DWORD _ed = GetLastError(); 
      _err.Format(L" ERROR# %u", _ed); 
      MessageBox (NULL , _err , L"123" , MB_OK); 
      PostQuitMessage(0); 
      return FALSE; } } 
CloseHandle(_dh); 

這工作,但只有第一次。當目錄已經存在CreateFile失敗,錯誤#5:ACCESS DENIED,即使應用程序重新啓動。

我的錯誤在哪裏?

UPDATE

只是試圖manualy創建目標文件夾 - 同樣的問題。

CreateFile(_ddn , GENERIC_READ , FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_DIRECTORY , NULL); 

此調用始終調用ERROR_ACCESS_DENIED錯誤消息(0x5錯誤代碼)。

回答

3

MSDN

要使用的CreateFile打開一個目錄,指定FILE_FLAG_BACKUP_SEMANTICS標誌作爲dwFlagsAndAttributes的一部分。

所以更改爲:

_dh = CreateFile(_ddn , GENERIC_READ , FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_FLAG_BACKUP_SEMANTICS , NULL); 

代替。

不要使用FILE_ATTRIBUTE_DIRECTORY,它甚至沒有記錄。

+0

這是不真實的!我讀過[此頁](http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v = vs.85).aspx)十幾次,但沒有看到關於FILE_FLAG_BACKUP_SEMANTICS 。而且,我的應用程序所做的所有工作都是數據備份謝謝你,兄弟! –

+0

這完全解決了我的問題 –

+0

FILE_ATTRIBUTE_DIRECTORY通常與FindFirstFile/FindNextFile/FindClose三元組一起使用。 – kol