Como: Consultar o conteúdo dos arquivos em uma pasta (LINQ)

Este exemplo mostra como consultar sobre todos os arquivos em uma árvore de diretório especificado, abra cada arquivo e inspecionar o seu conteúdo. Esse tipo de técnica poderia ser usado para criar índices ou reverter os índices do conteúdo de uma árvore de diretório. Este exemplo é executada uma pesquisa de cadeia de caracteres simples. No entanto, os tipos mais complexos de correspondência de padrões podem ser executados com uma expressão regular. Para obter mais informações, consulte Como: Combinar consultas do LINQ com expressões regulares.

Exemplo

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

Compilando o código

  • Criar um Visual Studio o projeto que se destina a .NET Framework versão 3.5. Por padrão, o projeto tem uma referência a System.Core.dll e um using diretiva (C#) ou Imported namespace (Visual Basic) para o namespace System. LINQ. No C# projetos, adicione um using a diretiva para o namespace System. IO.

  • Copie este código em seu projeto.

  • Pressione F5 para compilar e executar o programa.

  • Pressione qualquer tecla para sair da janela do console.

Programação robusta

Para operações de consulta intensivo sobre o conteúdo de vários tipos de documentos e arquivos, considere o uso de O Windows Desktop Search engine.

Consulte também

Conceitos

LINQ para Objetos

LINQ e os diretórios de arquivos