Partager via


Guide pratique pour rechercher le nombre total d’octets dans un ensemble de dossiers (LINQ) (Visual Basic)

Cet exemple montre comment récupérer le nombre total d’octets utilisés par tous les fichiers d’un dossier spécifié et tous ses sous-dossiers.

Exemple :

La Sum méthode ajoute les valeurs de tous les éléments sélectionnés dans la select clause. Vous pouvez facilement modifier cette requête pour récupérer le fichier le plus grand ou le plus petit dans l’arborescence de répertoires spécifiée en appelant la méthode Min ou Max au lieu 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 vous n’avez à compter que le nombre d’octets dans une arborescence de répertoires spécifiée, vous pouvez le faire plus efficacement sans créer de requête LINQ, ce qui entraîne la surcharge de création de la collection de listes en tant que source de données. L’utilité de l’approche LINQ augmente à mesure que la requête devient plus complexe, ou lorsque vous devez exécuter plusieurs requêtes sur la même source de données.

La requête appelle une méthode distincte pour obtenir la longueur du fichier. Elle procède ainsi pour utiliser l’exception qui sera éventuellement levée si le fichier a été supprimé sur un autre thread après la création de l’objet FileInfo dans l’appel à GetFiles. Même si l’objet FileInfo a déjà été créé, l’exception peut se produire, car un FileInfo objet tente d’actualiser sa Length propriété avec la durée la plus actuelle la première fois que la propriété est accessible. En plaçant cette opération dans un bloc try-catch en dehors de la requête, le code suit la règle d’éviter les opérations dans les requêtes qui peuvent provoquer des effets secondaires. En règle générale, il faut faire très attention lors de l’utilisation d’exceptions et s’assurer que l’application ne reste pas dans un état inconnu.

Compiler le code

Créez un projet d’application console Visual Basic, avec une Imports instruction pour l’espace de noms System.Linq.

Voir aussi