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.