2012-12-31 88 views
8

Directory.EnumerateFiles方法的默認讀取順序是什麼?它一致嗎?Directory.EnumerateFiles讀取順序(C#)

根據我的經驗,迄今爲止似乎是創建文件的日期,但我一直未能找到確認。

我想問的原因是因爲我正在處理的程序的一部分將二進制文件從目錄加載到對象中,然後將這些對象加載到數組中。這些對象通過索引數組相互引用,這意味着它們加載到數組中的順序需要保持一致(以避免索引轉換)。

雖然我在這裏,我還有一個小問題。當文件被刪除時,無論我做什麼,它都會明顯改變加載到數組中的文件的索引。有什麼建議可以避免這個問題?由於擔心存儲問題,我避免使用字典(如果我可以避免的話,不用存儲文本鍵的數組),但如果它是唯一可行的方法,那麼我可能必須實現它。


編輯:從你的答案極好的提示後,我已經重構使用文件名的字典方法。性能影響相當可忽略,可讀性和可維護性都大大提高,因此工作得很好。

+0

爲什麼不只是保留一個引用而不是索引?如果你這樣做,你不必擔心索引被洗牌。 – casperOne

+0

由於文件序列化的工作方式。如果我要通過序列化保存包含引用的文件,然後加載這些文件,每次都會加載整個對象樹,導致大量複製。例如,如果汽車引用輪胎和卡車引用輪胎,並且他們都被保存然後加載,我會有2個重複的輪胎實例。 – Djentleman

+2

來自[MSDN](http://msdn.microsoft.com/en-us/library/07wt70x2.aspx),關於'GetFiles'(本質上調用'EnumerateFiles'):*返回的文件名的順序是不保證;如果需要特定的排序順序,請使用Sort()方法。*我建議您,如文檔所述,使用您自己的排序方法。 – Mir

回答

10

據我所知,這是沒有記錄 - 因此,即使你可以發現一個模式,你不應該依賴它。它可能取決於.NET的版本,或者操作系統的版本,或者只是在不同的服務包之間切換。相反,如果你需要一些特定的順序,你應該自己排序。當然,不幸的是,需要在處理它們之前找到所有的文件名,但它會給你一致性。

說實話,聽起來好像你有一個非常脆弱的數據模型。你還沒有真正告訴我們你正在做什麼來修復它,但在Directory.EnumerateFiles的結果中使用文件的整數索引是肯定是不是最好的方法。

如果您使用文件名稱而不是索引,這將允許您在閱讀文件時處理文件,但有可能 - 但根據您想要做什麼,可能會有更好的方法。使用這個名字應該還是相當便宜 - 它只是一個單一的字符串引用而不是一個整數,即使它在多個地方使用,它也會被多次引用到同一個字符串對象。

4

該文檔沒有指定訂單,但您可以始終使用LINQ的OrderBy函數強制執行您的訂單。

您可以通過清除對null的引用來跳過索引更改,而不是實際從陣列中刪除項目。這裏的折衷是,您現在必須檢查給定索引處的項目是否爲null

如果你有一個基於Dictionary的更可讀的數據結構,請考慮切換到它,並忽略效率問題,直到你的分析器告訴你必須優化代碼的這個特定部分。

13

.NET使用的底層Win32 API是FindFirstFileFindNextFiledocumentation specifically states

此函數返回文件名的順序取決於文件系統類型。對於NTFS文件系統和CDFS文件系統,名稱通常按字母順序返回。使用FAT文件系統時,名稱通常按照文件寫入磁盤的順序返回,這可能是也可能不是按字母順序排列。但是,如前所述,這些行爲並不能保證。

所以不,你不能保證文件返回的順序。其他答案提供瞭解決此問題的充分方法。

+0

謝謝。有用! – Shimmy

+0

我喜歡這個技術細節和鏈接。 – Gqqnbig