Partager via


Guide pratique pour rechercher le fichier ou les fichiers les plus volumineux dans une arborescence de répertoires (LINQ) (Visual Basic)

Cet exemple montre cinq requêtes liées à la taille de fichier en octets :

  • Comment récupérer la taille en octets du plus grand fichier.

  • Comment récupérer la taille en octets du plus petit fichier.

  • Comment récupérer le FileInfo plus grand ou le plus petit fichier d’un ou plusieurs dossiers sous un dossier racine spécifié.

  • Comment récupérer une séquence telle que les 10 fichiers les plus volumineux.

  • Comment classer les fichiers en groupes en fonction de leur taille de fichier en octets, en ignorant les fichiers inférieurs à une taille spécifiée.

Exemple :

L’exemple suivant contient cinq requêtes distinctes qui montrent comment interroger et regrouper des fichiers, en fonction de leur taille de fichier en octets. Vous pouvez facilement modifier ces exemples pour baser la requête sur une autre propriété de l’objet FileInfo .

Module QueryBySize  
    Sub Main()  
  
        ' Change the drive\path if necessary  
        Dim root As String = "C:\Program Files\Microsoft Visual Studio 9.0"  
  
        'Take a snapshot of the folder contents  
        Dim dir As New System.IO.DirectoryInfo(root)  
        Dim fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories)  
  
        ' Return the size of the largest file  
        Dim maxSize = Aggregate aFile In fileList Into Max(GetFileLength(aFile))  
  
        'Dim maxSize = fileLengths.Max  
        Console.WriteLine("The length of the largest file under {0} is {1}", _  
                          root, maxSize)  
  
        ' Return the FileInfo object of the largest file  
        ' by sorting and selecting from the beginning of the list  
        Dim filesByLengDesc = From file In fileList _  
                              Let filelength = GetFileLength(file) _  
                              Where filelength > 0 _  
                              Order By filelength Descending _  
                              Select file  
  
        Dim longestFile = filesByLengDesc.First  
  
        Console.WriteLine("The largest file under {0} is {1} with a length of {2} bytes", _  
                          root, longestFile.FullName, longestFile.Length)  
  
        Dim smallestFile = filesByLengDesc.Last  
  
        Console.WriteLine("The smallest file under {0} is {1} with a length of {2} bytes", _  
                                root, smallestFile.FullName, smallestFile.Length)  
  
        ' Return the FileInfos for the 10 largest files  
        ' Based on a previous query, but nothing is executed  
        ' until the For Each statement below.  
        Dim tenLargest = From file In filesByLengDesc Take 10  
  
        Console.WriteLine("The 10 largest files under {0} are:", root)  
  
        For Each fi As System.IO.FileInfo In tenLargest  
            Console.WriteLine("{0}: {1} bytes", fi.FullName, fi.Length)  
        Next  
  
        ' Group files according to their size,  
        ' leaving out the ones under 200K  
        Dim sizeGroups = From file As System.IO.FileInfo In fileList _  
                         Where file.Length > 0 _  
                         Let groupLength = file.Length / 100000 _  
                         Group file By groupLength Into fileGroup = Group _  
                         Where groupLength >= 2 _  
                         Order By groupLength Descending  
  
        For Each group In sizeGroups  
            Console.WriteLine(group.groupLength + "00000")  
  
            For Each item As System.IO.FileInfo In group.fileGroup  
                Console.WriteLine("   {0}: {1}", item.Name, item.Length)  
            Next  
        Next  
  
        ' 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.  
    ' In this particular case, it is safe to ignore the exception.  
    Function GetFileLength(ByVal fi As System.IO.FileInfo) As Long  
        Dim retval As Long  
        Try  
            retval = fi.Length  
        Catch ex As FileNotFoundException  
            ' If a file is no longer present,  
            ' just return zero bytes.
            retval = 0  
        End Try  
  
        Return retval  
    End Function  
End Module  

Pour retourner un ou plusieurs objets complets FileInfo , la requête doit d’abord examiner chacune d’elles dans la source de données, puis les trier par la valeur de leur propriété Length. Ensuite, il peut retourner le seul élément ou la séquence avec la plus grande longueur. Permet First de retourner le premier élément d’une liste. Permet Take de retourner le premier n nombre d’éléments. Spécifiez un ordre de tri décroissant pour placer les plus petits éléments au début de la liste.

La requête appelle une méthode distincte pour obtenir la taille du fichier en octets afin de gérer l'exception possible qui sera levée dans le cas où un fichier a été supprimé sur un autre thread depuis que l'objet FileInfo a été créé dans l'appel à GetFiles. Même si l'objet FileInfo a déjà été créé, l’exception peut se produire car un objet FileInfo va tenter d’actualiser sa propriété Length en utilisant la taille actuelle la plus récente en octets, la première fois que la propriété est accédée. En plaçant cette opération dans un bloc try-catch en dehors de la requête, nous suivons la règle d’éviter les opérations dans les requêtes qui peuvent entraîner 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