Compartir a través de


Cómo: Consultar el número total de bytes en un conjunto de carpetas (LINQ) (Visual Basic)

En este ejemplo se muestra cómo recuperar el número total de bytes utilizados por todos los archivos de una carpeta especificada y todas sus subcarpetas.

Ejemplo

El Sum método agrega los valores de todos los elementos seleccionados en la select cláusula . Puede modificar fácilmente esta consulta para recuperar el archivo más grande o más pequeño del árbol de directorios especificado llamando al Min método o Max en lugar 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  

Si solo tiene que contar el número de bytes en un árbol de directorios especificado, puede hacerlo de forma más eficaz sin crear una consulta LINQ, lo que conlleva la sobrecarga de crear la colección de listas como origen de datos. La utilidad del enfoque LINQ aumenta a medida que la consulta se vuelve más compleja o cuando tiene que ejecutar varias consultas en el mismo origen de datos.

La consulta llama a un método independiente para obtener la longitud del archivo. Lo hace para consumir la excepción que probablemente se producirá si el archivo se ha eliminado en otro subproceso después de que se creara el objeto FileInfo en la llamada a GetFiles. Aunque el FileInfo objeto ya se haya creado, se puede producir la excepción porque un FileInfo objeto intentará actualizar su Length propiedad con la longitud más actual la primera vez que se accede a la propiedad. Al colocar esta operación en un bloque try-catch fuera de la consulta, el código sigue la regla de evitar operaciones en consultas que pueden causar efectos secundarios. En general, debe tener mucho cuidado al consumir excepciones para asegurarse de que no deja una aplicación en un estado desconocido.

Compilación del código

Cree un proyecto de aplicación de consola de Visual Basic con una instrucción Imports para el espacio de nombres System.Linq.

Consulte también