Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.