2013-03-18 90 views
0

對於我的目的,我希望從Windows上的NTFS文件系統上的指定文件夾優化遞歸枚舉子文件夾的方式,和我碰到這個小「寶石」從微軟的網頁來抓FindFirstFile API:FindFirstFile,FindNextFile API不可靠嗎?

注意在極少數情況下,或系統的負荷很重時,文件屬性在NTFS文件系統 信息可能不會在這個 函數被調用時的電流。要確保獲得當前的NTFS文件 系統文件屬性,請調用GetFileInformationByHandle函數。

所以,讓我試着理解它。

我確實依賴WIN32_FIND_DATA結構中返回的dwFileAttributes參數來告訴文件夾中的文件。所以這個筆記所暗示的是,在某些情況下,我可能會得到一些虛假的結果,對吧?如果是這樣,爲什麼不修復它的一個更新,而不是在這裏發佈?

而且他們建議使用GetFileInformationByHandle API的解決方法。我到底該怎麼稱呼它?它需要一個文件句柄。那麼他們是否真的希望我們打開FindNextFile返回的每個文件並且打電話給GetFileInformationByHandle?你能想象我的優化能夠在多遠的情況下采用這種方法嗎?

不管怎麼說,這將會是好的,如果有人能提供一些線索對這個...

+3

FindXxxFile返回的值是通知性的而非權威性的。參見討論[here](http://blogs.msdn.com/b/oldnewthing/archive/2011/12/26/10251026.aspx)。 – 2013-03-18 03:12:07

回答

1

dwFileAttributes是不是將是不可靠的,當談到告訴文件和文件夾的區別的東西。我認爲這個提示指的是可能被文件系統緩存以供更新的信息(修改/訪問時間戳等),但是一個項目是文件還是文件夾並不會改變。

+0

除非有人刪除文件/文件夾,然後將文件夾/文件重命名爲相同的名稱。 – 2013-03-18 03:25:48

+1

但是他們也可以在FindNextFile返回後這樣做,所以這裏沒有新問題。即使FindNextFile總是返回當前數據,您也必須處理這種可能性。 – 2013-03-18 04:46:52

+0

@RaymondChen:確實如此。這是警告出現的原因之一。 (某些狀態報告功能有被濫用的歷史,或者如果濫用會造成特別嚴重的後果,並且通常包含一個警告,說明結果可能不是最新的。) – 2013-03-18 06:59:21

4

從文件夾中區分文件是可以的,因爲該信息可能是恆定的。文件不會被轉換爲文件夾或文件夾。

該文檔說「可能不是當前的」,因爲其他進程可能正在改變屬性,並且沒有鎖定機制來同步屬性正在被懶惰地編寫。如果你的應用程序需要絕對的當前信息,你可以檢索它... ByHandle確保信息是最新的。

+0

「可能是恆定的」是輕描淡寫。只有當某人寫入處理時,信息纔會過時,並且在有人寫入文件時不能將文件更改爲文件夾。 – MSalters 2013-03-18 12:49:24

2

這是每個狀態報告功能的工作方式。最好的情況是,當你調用函數和函數返回時,它會在中間某個未定義的點處報告狀態。但它不會「凍結世界」以確保數據在以後仍然有效。

在沒有考慮到這些因素的情況下,文檔通常只記錄通常會導致嚴重問題的功能,特別是安全問題,而不是在每個功能上註明這一點。

如果您打開一個文件並獲取一個文件的句柄,那麼您可以確信,使用該句柄的所有操作都將歸入相同的底層文件。但是當你按名稱進行操作時,沒有這種保證。文件可以被創建,刪除和重命名。所以同一個名字可能以後不會引用同一個文件。