Delen via


Procedure: Query uitvoeren voor het grootste bestand of de grootste bestanden in een mapstructuur (LINQ) (Visual Basic)

In dit voorbeeld ziet u vijf query's met betrekking tot de bestandsgrootte in bytes:

  • Hoe de grootte in bytes van het grootste bestand op te halen.

  • Hoe de grootte in bytes van het kleinste bestand op te halen.

  • Het grootste of kleinste bestand van het FileInfo object ophalen uit een of meer mappen onder een opgegeven hoofdmap.

  • Hoe haal je een reeks op, zoals de 10 grootste bestanden.

  • Bestanden rangschikken in groepen op basis van hun bestandsgrootte in bytes, waarbij bestanden worden genegeerd die kleiner zijn dan een opgegeven grootte.

Voorbeeld

Het volgende voorbeeld bevat vijf afzonderlijke query's die laten zien hoe u bestanden opvraagt en groepeert, afhankelijk van de bestandsgrootte in bytes. U kunt deze voorbeelden eenvoudig wijzigen om de query te baseren op een andere eigenschap van het FileInfo object.

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  

Als u een of meer volledige FileInfo objecten wilt retourneren, moet de query eerst elk object in de gegevensbron onderzoeken en vervolgens sorteren op de waarde van de eigenschap Length. Vervolgens kan de ene of de reeks met de grootste lengte worden geretourneerd. Gebruik First dit om het eerste element in een lijst te retourneren. Gebruik Take dit om het eerste n aantal elementen te retourneren. Geef een aflopende sorteervolgorde op om de kleinste elementen aan het begin van de lijst te plaatsen.

De query roept een afzonderlijke methode aan om de bestandsgrootte in bytes te verkrijgen, zodat de mogelijke uitzondering kan worden opgevangen die kan optreden in het geval dat een bestand in de tijdsperiode sinds het FileInfo object is gemaakt op een andere thread is verwijderd, tijdens de aanroep naar GetFiles. Zelfs als het FileInfo object al is gemaakt, kan de uitzondering optreden omdat een FileInfo object zal proberen zijn Length eigenschap te vernieuwen door gebruik te maken van de meest recente grootte in bytes de eerste keer dat de eigenschap wordt geopend. Door deze bewerking buiten de query in een try-catch-blok te plaatsen, volgen we de regel om bewerkingen in query's te voorkomen die bijwerkingen kunnen veroorzaken. Over het algemeen moet er veel aandacht worden besteed aan het afhandelen van uitzonderingen, om ervoor te zorgen dat een toepassing niet in een onbekende status wordt achtergelaten.

De code compileren

Maak een Visual Basic-consoletoepassingsproject met een Imports instructie voor de System.Linq-naamruimte.

Zie ook