Procedure: Een query uitvoeren voor het totale aantal bytes in een set mappen (LINQ) (Visual Basic)
In dit voorbeeld ziet u hoe u het totale aantal bytes ophaalt dat wordt gebruikt door alle bestanden in een opgegeven map en alle bijbehorende submappen.
Opmerking
De Sum methode voegt de waarden toe van alle items die in de select
component zijn geselecteerd. U kunt deze query eenvoudig wijzigen om het grootste of kleinste bestand in de opgegeven mapstructuur op te halen door de Min of Max methode aan te roepen in plaats van 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
Als u alleen het aantal bytes in een opgegeven mapstructuur hoeft te tellen, kunt u dit efficiƫnter doen zonder een LINQ-query te maken, waardoor de overhead van het maken van de lijstverzameling als gegevensbron in rekening wordt gebracht. De bruikbaarheid van de LINQ-benadering neemt toe naarmate de query complexer wordt of wanneer u meerdere query's moet uitvoeren op dezelfde gegevensbron.
De query roept een afzonderlijke methode aan om de lengte van het bestand te verkrijgen. Dit doet u om de mogelijke uitzondering te gebruiken die wordt gegenereerd als het bestand is verwijderd op een andere thread nadat het FileInfo object is gemaakt in de aanroep naar GetFiles
. Hoewel het FileInfo object al is gemaakt, kan de uitzondering optreden omdat een FileInfo object probeert de eigenschap te vernieuwen Length met de meest recente lengte wanneer de eigenschap voor het eerst wordt geopend. Door deze bewerking buiten de query in een try-catchblok te plaatsen, volgt de code de regel om bewerkingen in query's te voorkomen die bijwerkingen kunnen veroorzaken. Over het algemeen moet u goed letten wanneer u uitzonderingen gebruikt om ervoor te zorgen dat een toepassing niet in een onbekende status blijft.
De code compileren
Maak een Visual Basic-consoletoepassingsproject met een Imports
instructie voor de System.Linq-naamruimte.