Udostępnij za pośrednictwem


Porady: wykonywanie zapytań o łączną liczbę bajtów w zestawie folderów (LINQ) (Visual Basic)

W tym przykładzie pokazano, jak pobrać całkowitą liczbę bajtów używanych przez wszystkie pliki w określonym folderze i wszystkie jego podfoldery.

Przykład

Metoda Sum dodaje wartości wszystkich elementów wybranych w klauzuli select . To zapytanie można łatwo zmodyfikować, aby pobrać największy lub najmniejszy plik w określonym drzewie katalogów, wywołując metodę Min lub Max zamiast 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  

Jeśli musisz tylko policzyć liczbę bajtów w określonym drzewie katalogów, możesz to zrobić wydajniej bez tworzenia zapytania LINQ, co powoduje narzut na utworzenie kolekcji listy jako źródła danych. Użyteczność podejścia LINQ zwiększa się, gdy zapytanie staje się bardziej złożone lub gdy trzeba uruchomić wiele zapytań względem tego samego źródła danych.

Zapytanie wywołuje oddzielną metodę w celu uzyskania długości pliku. Robi to w celu korzystania z możliwego wyjątku, który zostanie zgłoszony, jeśli plik został usunięty w innym wątku po utworzeniu FileInfo obiektu w wywołaniu metody GetFiles. Mimo że FileInfo obiekt został już utworzony, może wystąpić wyjątek, ponieważ FileInfo obiekt spróbuje odświeżyć jego Length właściwość o największej bieżącej długości przy pierwszym uzyskiwaniu dostępu do właściwości. Umieszczając tę operację w bloku try-catch poza zapytaniem, kod jest zgodny z regułą 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 też