Delen via


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.

Zie ook