Freigeben über


Gewusst wie: Abfragen des Inhalts von Dateien in einem Ordner (LINQ)

In diesem Beispiel ist dargestellt, wie eine Abfrage für alle Dateien in einer angegebenen Verzeichnisstruktur erstellt wird, die einzelnen Dateien geöffnet und die jeweiligen Inhalte geprüft werden. Mit dieser Technik können Indizes oder umgekehrte Indizes des Inhalts einer Verzeichnisstruktur erstellt werden. In diesem Beispiel wird eine einfache Zeichenfolgensuche ausgeführt. Komplexere Formen des Mustervergleichs können jedoch mit einem regulären Ausdruck ausgeführt werden. Weitere Informationen finden Sie unter Gewusst wie: Kombinieren von LINQ-Abfragen mit regulären Ausdrücken.

Beispiel

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;
    }
}

Kompilieren des Codes

  • Erstellen Sie ein Visual Studio-Projekt für die .NET Framework-Version 3.5. Standardmäßig weist das Projekt einen Verweis auf System.Core.dll und eine using-Direktive (C#) oder einen importierten Namespace (Visual Basic) für den System.Linq-Namespace auf. Fügen Sie in C#-Projekten eine using-Direktive für den System.IO-Namespace hinzu.

  • Kopieren Sie diesen Code ins Projekt.

  • Drücken Sie F5, um das Programm zu kompilieren und auszuführen.

  • Drücken Sie eine beliebige Taste, um das Konsolenfenster zu schließen.

Robuste Programmierung

Für umfassende Abfrageoperationen über die Inhalte mehrerer Arten von Dokumenten und Dateien empfiehlt es sich, das Modul Windows Desktop Search zu verwenden.

Siehe auch

Konzepte

LINQ-zu-Objekte

LINQ und Dateiverzeichnisse