LINQ 和檔案目錄
更新:2007 年 11 月
許多檔案系統作業基本上就是查詢,因此最適合 LINQ 方式。
注意事項: |
---|
若要同時針對多種類型的檔案和文件內容執行程式設計查詢,請考慮使用 Windows 桌面搜尋引擎 (英文)。雖然您目前無法使用 LINQ 查詢它,但是它卻可提供能夠有效應付檔案系統複雜度的強大索引服務。 |
請注意,本節中的查詢是非破壞性的。不可以用來變更原始檔案或資料夾的內容。這是依照查詢不應該造成任何副作用的規則。一般而言,任何修改來源資料的程式碼 (包括執行 create/update/delete 運算子的查詢),都應該與單純查詢資料的程式碼分開。
本章節包括下列主題:
HOW TO:查詢具有指定屬性或名稱的檔案
顯示如何藉由檢查檔案之 FileInfo 物件的一個或多個屬性來搜尋檔案。HOW TO:依副檔名分組檔案 (LINQ)
顯示如何依據檔案的副檔名來傳回 FileInfo 物件的群組。HOW TO:查詢一組資料夾中的位元組總數 (LINQ)
顯示如何傳回指定之目錄樹狀結構中所有檔案的位元組總數。HOW TO:比較兩個資料夾的內容 (LINQ)
顯示如何傳回所有同時出現在兩個所指定資料夾中的檔案,以及所有只出現在其中一個資料夾的檔案。HOW TO:查詢目錄樹狀結構中的最大檔案或多個檔案 (LINQ)
顯示如何傳回目錄樹狀結構中最大或最小的檔案,或是所指定數目的檔案。HOW TO:查詢目錄樹狀結構中的重複檔案 (LINQ)
顯示如何將所有出現在所指定目錄樹狀結構中多個位置的檔案名稱。同時也顯示如何根據自訂比較子 (Comparer) 來執行較為複雜的比較。HOW TO:查詢資料夾中的檔案內容 (LINQ)
顯示如何逐一查看樹狀目錄中的資料夾、開啟每個檔案,並查詢檔案的內容。
註解
要建立能夠精確代表檔案系統內容,同時又能順利處理例外狀況 (Exception) 的資料來源,其實是件複雜的工作。本節中的範例會建立 FileInfo 物件的快照集 (Snapshot) 集合,以代表所指定根資料夾和其所有子資料夾下的所有檔案。自查詢開始到查詢結束的整個期間,每個 FileInfo 的實際狀態都可能會變更。例如,您可以建立 FileInfo 物件的清單做為資料來源。如果您嘗試在查詢中存取 Length 屬性,則 FileInfo 物件會嘗試存取檔案系統以更新 Length 的值。如果檔案不再存在,則即使您並未直接查詢檔案系統,也會在查詢中收到 FileNotFoundException。本節中的某些查詢會專門使用一個方法,在特定情況下消化這類例外狀況。另一個選項是使用 FileSystemWatcher 持續動態更新資料來源。