Dela via


Anvisningar: Fråga efter totalt antal byte i en uppsättning mappar (LINQ) (Visual Basic)

Det här exemplet visar hur du hämtar det totala antalet byte som används av alla filer i en angiven mapp och alla dess undermappar.

Exempel

Metoden Sum lägger till värdena för alla objekt som valts select i -satsen. Du kan enkelt ändra den här frågan för att hämta den största eller minsta filen i det angivna katalogträdet Min genom att anropa metoden eller Max i stället för 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  

Om du bara behöver räkna antalet byte i ett angivet katalogträd kan du göra detta mer effektivt utan att skapa en LINQ-fråga, vilket medför att du behöver skapa listsamlingen som en datakälla. Linq-metodens användbarhet ökar när frågan blir mer komplex, eller när du måste köra flera frågor mot samma datakälla.

Frågan anropar en separat metod för att hämta fillängden. Den gör detta för att använda det möjliga undantaget som utlöses om filen togs bort i en annan tråd efter FileInfo att objektet skapades i anropet till GetFiles. Även om objektet FileInfo redan har skapats kan undantaget inträffa eftersom ett FileInfo objekt försöker uppdatera sin Length egenskap med den senaste längden första gången egenskapen används. Genom att placera den här åtgärden i ett try-catch-block utanför frågan följer koden regeln för att undvika åtgärder i frågor som kan orsaka biverkningar. I allmänhet måste du vara mycket försiktig när du använder undantag för att se till att ett program inte lämnas i ett okänt tillstånd.

Kompilera koden

Skapa ett Visual Basic-konsolprogramprojekt med en Imports instruktion för System.Linq-namnområdet.

Se även