Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo esempio viene illustrato come recuperare il numero totale di byte utilizzati da tutti i file in una cartella specificata e tutte le relative sottocartelle.
Esempio
Il Sum metodo aggiunge i valori di tutti gli elementi selezionati nella select clausola . È possibile modificare facilmente questa query per recuperare il file più grande o più piccolo nell'albero di directory specificato chiamando il metodo Min o Max anziché 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 è necessario contare solo il numero di byte in un albero di directory specificato, è possibile farlo in modo più efficiente senza creare una query LINQ, che comporta il sovraccarico della creazione della raccolta di elenchi come origine dati. L'utilità dell'approccio LINQ aumenta man mano che la query diventa più complessa o quando è necessario eseguire più query sulla stessa origine dati.
La query chiama un metodo separato per ottenere la lunghezza del file. Questa operazione viene eseguita per utilizzare la possibile eccezione che verrà generata se il file è stato eliminato in un altro thread dopo la creazione dell'oggetto FileInfo nella chiamata a GetFiles. Anche se l'oggetto FileInfo è già stato creato, l'eccezione può verificarsi perché un FileInfo oggetto tenterà di aggiornarne Length la proprietà con la lunghezza più recente alla prima accesso alla proprietà. Inserendo questa operazione in un blocco try-catch all'esterno della query, il codice segue la regola di evitare operazioni nelle query che possono causare effetti collaterali. In generale, è necessario prestare molta attenzione quando si utilizzano eccezioni per assicurarsi che un'applicazione non venga lasciata in uno stato sconosciuto.
Compilare il codice
Creare un progetto di applicazione console di Visual Basic con un'istruzione Imports per lo spazio dei nomi System.Linq.