Udostępnij za pomocą


Jak wykonać zapytanie dotyczące największego pliku lub plików w strukturze katalogów (LINQ) (Visual Basic)

W tym przykładzie pokazano pięć zapytań związanych z rozmiarem pliku w bajtach:

  • Jak pobrać rozmiar w bajtach największego pliku.

  • Jak pobrać rozmiar w bajtach najmniejszego pliku.

  • Jak pobrać obiekt FileInfo plik, który jest największy lub najmniejszy, z jednego lub więcej folderów znajdujących się w określonym folderze głównym.

  • Jak pobrać sekwencję, taką jak 10 największych plików.

  • Jak porządkować pliki w grupach na podstawie rozmiaru pliku w bajtach, ignorując pliki, które są mniejsze niż określony rozmiar.

Przykład

Poniższy przykład zawiera pięć oddzielnych zapytań, które pokazują, jak wykonywać zapytania i grupować pliki w zależności od rozmiaru pliku w bajtach. Możesz łatwo zmodyfikować te przykłady, aby oprzeć zapytanie na innej właściwości FileInfo obiektu.

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  

Aby zwrócić co najmniej jeden pełny FileInfo obiekt, najpierw zapytanie musi zbadać każdy z nich w źródle danych, a następnie posortować je według wartości właściwości Length. Następnie może zwrócić albo pojedynczy element, albo sekwencję o największej długości. Użyj polecenia First , aby zwrócić pierwszy element na liście. Użyj Take, aby zwrócić pierwsze n elementów. Określ kolejność sortowania malejącego, aby umieścić najmniejsze elementy na początku listy.

Zapytanie wywołuje oddzielną metodę w celu uzyskania rozmiaru pliku w bajtach, aby obsłużyć potencjalny wyjątek, który może zostać zgłoszony, jeśli plik został usunięty w innym wątku od momentu utworzenia obiektu przez wywołanie metody FileInfo. Nawet jeśli obiekt FileInfo został już utworzony, może wystąpić wyjątek, ponieważ obiekt FileInfo spróbuje odświeżyć swoją właściwość Length przy użyciu najbardziej aktualnego rozmiaru w bajtach podczas pierwszego dostępu do właściwości. Umieszczając tę operację w bloku try-catch poza zapytaniem, stosujemy się do reguły unikania operacji w zapytaniach, które mogą powodować skutki uboczne. Ogólnie rzecz biorąc, należy zachować szczególną ostrożność podczas korzystania z wyjątków, aby upewnić się, że aplikacja nie jest pozostawiona w nieznanym stanie.

Kompilowanie kodu

Utwórz projekt aplikacji konsolowej języka Visual Basic z instrukcją Imports dla przestrzeni nazw System.Linq.

Zobacz także