Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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.