共用方式為


如何:查詢資料夾中的檔案內容 (LINQ)

這個範例顯示如何查詢所指定目錄樹狀結構中的所有檔案、開啟每個檔案,然後檢查檔案的內容。 這類技巧可以用來建立索引,或將目錄樹狀結構內容的索引反轉。 在這個範例中,執行的是簡單字串搜尋。 不過,您可以使用規則運算式 (Regular Expression) 執行更複雜的模式比對類型。 如需詳細資訊,請參閱 如何:合併 LINQ 查詢與規則運算式

範例

Module Module1
    'QueryContents 
    Public Sub Main()

        ' Modify this path as necessary. 
        Dim startFolder = "c:\program files\Microsoft Visual Studio 9.0\VB\" 

        'Take a snapshot of the folder contents 
        Dim dir As New System.IO.DirectoryInfo(startFolder)
        Dim fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories)

        Dim searchTerm = "Visual Studio" 

        ' Search the contents of each file. 
        ' A regular expression created with the RegEx class 
        ' could be used instead of the Contains method. 
        Dim queryMatchingFiles = From file In fileList _
                                 Where file.Extension = ".htm" _
                                 Let fileText = GetFileText(file.FullName) _
                                 Where fileText.Contains(searchTerm) _
                                 Select file.FullName

        Console.WriteLine("The term " & searchTerm & " was found in:")

        ' Execute the query. 
        For Each filename In queryMatchingFiles
            Console.WriteLine(filename)
        Next 

        ' Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit")
        Console.ReadKey()

    End Sub 

    ' Read the contents of the file. This is done in a separate 
    ' function in order to handle potential file system errors. 
    Function GetFileText(ByVal name As String) As String 

        ' If the file has been deleted, the right thing 
        ' to do in this case is return an empty string. 
        Dim fileContents = String.Empty

        ' If the file has been deleted since we took  
        ' the snapshot, ignore it and return the empty string. 
        If System.IO.File.Exists(name) Then
            fileContents = System.IO.File.ReadAllText(name)
        End If 

        Return fileContents

    End Function 
End Module
class QueryContents
{
    public static void Main()
    {
        // Modify this path as necessary. 
        string startFolder = @"c:\program files\Microsoft Visual Studio 9.0\";

        // Take a snapshot of the file system.
        System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);

        // This method assumes that the application has discovery permissions 
        // for all folders under the specified path.
        IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

        string searchTerm = @"Visual Studio";

        // Search the contents of each file. 
        // A regular expression created with the RegEx class 
        // could be used instead of the Contains method. 
        // queryMatchingFiles is an IEnumerable<string>. 
        var queryMatchingFiles =
            from file in fileList
            where file.Extension == ".htm" 
            let fileText = GetFileText(file.FullName)
            where fileText.Contains(searchTerm)
            select file.FullName;

        // Execute the query.
        Console.WriteLine("The term \"{0}\" was found in:", searchTerm);
        foreach (string filename in queryMatchingFiles)
        {
            Console.WriteLine(filename);
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }

    // Read the contents of the file. 
    static string GetFileText(string name)
    {
        string fileContents = String.Empty;

        // If the file has been deleted since we took  
        // the snapshot, ignore it and return the empty string. 
        if (System.IO.File.Exists(name))
        {
            fileContents = System.IO.File.ReadAllText(name);
        }
        return fileContents;
    }
}

編譯程式碼

  • 建立一個以 .NET Framework 3.5 版為目標的 Visual Studio 專案。 此專案預設包含 System.Core.dll 的參考,以及 System.Linq 命名空間 (Namespace) 的 using 指示詞 (C#) 或 Imported 命名空間 (Visual Basic)。 請在 C# 專案中,加入 System.IO 命名空間的 using 指示詞。

  • 請將這段程式碼複製到您的專案,

  • 按 F5 編譯和執行程式。

  • 按任何鍵離開主控台視窗。

穩固程式設計

如需對多種類型的文件和檔案內容執行大量查詢作業,可考慮使用 Windows 桌面搜尋引擎。

請參閱

概念

LINQ to Objects

LINQ 和檔案目錄