2014-06-07 20 views
1

我不確定這是否已被問到,我似乎無法找到它。是否返回FindFirstFile/FindNextFile API對緩存結果?

當我在做一個文件夾的內容枚舉,你知道通常:

FindFirstFile(); 
do 
{ 
}while(FindNextFile()); 

如果當我還在我的do/while循環的文件夾的內容發生變化會怎麼樣?說,新的文件或文件夾被添加,更改或刪除。這是否反映在由FindNextFile返回的結果中?

+0

雖然我不知道答案,但通過在循環中添加Sleep語句足夠的秒數很容易,因此您可以在循環正在進行時刪除文件並親自查看。 – Amnon

+7

這個問題似乎沒有意義,因爲您總是有[TOCTOU](http://en.wikipedia.org/wiki/TOCTOU)競爭條件。這明確表示爲['FindFirstFile'](http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418.aspx):*「請注意,其他線程或進程可能會創建或在查詢結果和對信息採取行動的時間之間刪除一個具有此名稱的文件。「* – IInspectable

+0

@IInspectable:好的,好點。所以答案是,不。結果被提取爲「現場」。所以,我要問的原因是因爲我正在編寫一個方法來移動文件夾的內容,所以在這種情況下,如果我開始移動文件(或從文件夾中刪除文件),它可能會影響'FindNextFile'返回的結果。 , 對? – c00000fd

回答

4

一個快速測試案例顯示FindFirstFile不會在Windows 7上運行的本地文件系統上緩存結果。但是一旦調用FindNext,結果就會被緩存(不完全,只是一點點)。但是由於Windows SDK沒有記錄這些信息,因此必須將其視爲實施細節,並且可能隨時更改。因此,編寫代碼的方式不依賴於此行爲。

+1

它沒有完全緩存。 (在一個包含一百萬個文件的目錄中這會很糟糕。)它只緩存一點點。這種行爲不合約,可隨時更改。如果你想緩存全部內容,你需要自己做。 –

+0

我已經懷疑它不會完全緩存包含那麼多文件的目錄。我已經更新了我的答案,使其更加清晰。 –