Condividi tramite


Procedura: Eseguire una query per il numero totale di byte in un set di cartelle (LINQ) (Visual Basic)

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.

Vedere anche