Partilhar via


Como consultar o número total de bytes em um conjunto de pastas (LINQ) (Visual Basic)

Este exemplo mostra como recuperar o número total de bytes usados por todos os arquivos em uma pasta especificada e todas as suas subpastas.

Exemplo

O Sum método adiciona os valores de todos os itens selecionados na select cláusula. Você pode modificar facilmente essa consulta para recuperar o maior ou menor arquivo na árvore de diretórios especificada chamando o Min método or Max em vez de Sum.

Module QueryTotalBytes  
    Sub Main()  
  
        ' Change the drive\path if necessary.  
        Dim root As String = "C:\Program Files\Microsoft Visual Studio 9.0\VB"  
  
        'Take a snapshot of the folder contents.  
        ' This method assumes that the application has discovery permissions  
        ' for all folders under the specified path.  
        Dim fileList = My.Computer.FileSystem.GetFiles _  
                  (root, FileIO.SearchOption.SearchAllSubDirectories, "*.*")  
  
        Dim fileQuery = From file In fileList _  
                        Select GetFileLength(file)  
  
        ' Force execution and cache the results to avoid multiple trips to the file system.  
        Dim fileLengths = fileQuery.ToArray()  
  
        ' Find the largest file  
        Dim maxSize = Aggregate aFile In fileLengths Into Max()  
  
        ' Find the total number of bytes  
        Dim totalBytes = Aggregate aFile In fileLengths Into Sum()  
  
        Console.WriteLine("The largest file is " & maxSize & " bytes")  
        Console.WriteLine("There are " & totalBytes & " total bytes in " & _  
                          fileList.Count & " files under " & root)  
  
        ' Keep the console window open in debug mode  
        Console.WriteLine("Press any key to exit.")  
        Console.ReadKey()  
    End Sub  
  
    ' This method is used to catch the possible exception  
    ' that can be raised when accessing the FileInfo.Length property.  
    Function GetFileLength(ByVal filename As String) As Long  
        Dim retval As Long  
        Try  
            Dim fi As New System.IO.FileInfo(filename)  
            retval = fi.Length  
        Catch ex As System.IO.FileNotFoundException  
            ' If a file is no longer present,  
            ' just return zero bytes.
            retval = 0  
        End Try  
  
        Return retval  
    End Function  
End Module  

Se você só precisa contar o número de bytes em uma árvore de diretórios especificada, poderá fazer isso de forma mais eficiente sem criar uma consulta LINQ, que incorre na sobrecarga de criar a coleção de listas como uma fonte de dados. A utilidade da abordagem LINQ aumenta à medida que a consulta se torna mais complexa ou quando você precisa executar várias consultas na mesma fonte de dados.

A consulta chama para um método separado para obter o comprimento do arquivo. Ele faz isso para consumir a possível exceção que será gerada se o arquivo foi excluído em outro thread depois que o FileInfo objeto foi criado na chamada para GetFiles. Mesmo que o FileInfo objeto já tenha sido criado, a exceção pode ocorrer porque um FileInfo objeto tentará atualizar sua Length propriedade com o comprimento mais atual na primeira vez que a propriedade for acessada. Ao colocar essa operação em um bloco try-catch fora da consulta, o código segue a regra de evitar operações em consultas que podem causar efeitos colaterais. Em geral, muito cuidado deve ser tomado quando você consome exceções para garantir que um aplicativo não seja deixado em um estado desconhecido.

Compilar o código

Crie um projeto de aplicativo de console do Visual Basic, com uma Imports instrução para o namespace System.Linq.

Consulte também