2013-04-09 48 views
3

我只是有一個小測試,這就是我如何做到這一點:
我反覆創建和刪除一個目錄,例如d:\ test。我這樣做了1000次,並且在一段時間內總會遇到拒絕加密的錯誤。訪問被拒絕時,反覆創建和刪除相同的目錄

我的代碼寫的是這樣的:

TCHAR szError[MAX_PATH] = {0}; 
TCHAR lpszPath[MAX_PATH] = _T("d:\\test"); 
for(int i = 0; i != 1000; i++) 
{ 
    if (!CreateDirectory(lpszPath, NULL)) 
    { 
     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), NULL, szError, MAX_PATH, NULL); 
     MessageBox(NULL, szError, _T("create directory error"), MB_OK); 
     cout << i << endl; 
     return 0; 
    } 
    SetFileAttributes(lpszPath, FILE_ATTRIBUTE_NORMAL); 
    if (!RemoveDirectory(lpszPath)) 
    { 
     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), NULL, szError, MAX_PATH, NULL); 
     MessageBox(NULL, szError, _T("remove directory error"), MB_OK); 
     cout << i << endl; 
     return 0; 
    } 
} 

誰能告訴我爲什麼這個錯誤發生,如何避免這個錯誤?

+0

我不知道目錄刪除是否懶惰地執行,有時在目錄再次創建時尚未完成。 – 2013-04-09 02:37:40

+0

磁盤控制器上同時存在操作系統緩存和緩存,因此您可能是正確的。 – 2013-04-09 02:44:12

+0

如果系統仍然緩存,我怎麼能知道?我怎樣才能避免錯誤發生? – ericchan1336 2013-04-09 02:54:14

回答

0

如果這是速度問題,您可以考慮在每次創建/刪除之間使用睡眠功能。

0

請參閱RemoveDirectory文檔; 「 」RemoveDirectory函數將標記爲關閉時刪除的目錄,因此直到關閉該目錄的最後一個句柄才刪除目錄。「

這意味着,如果某事設法創建一個句柄到目錄中刪除,則此目錄不實際刪除,你會得到您的「拒絕訪問」(創建和刪除之間),

爲了解決這個重命名在刪除之前要刪除的目錄。