LINQ 和檔案目錄
許多檔案系統作業基本上就是查詢,因此最適合 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 持續動態更新資料來源。