Postupy: Dotazování na celkový počet bajtů v sadě složek (LINQ) (Visual Basic)

Tento příklad ukazuje, jak načíst celkový počet bajtů používaných všemi soubory v zadané složce a všechny její podsložky.

Příklad

Metoda Sum přidá hodnoty všech položek vybraných v klauzuli select . Tento dotaz můžete snadno upravit tak, aby načítal největší nebo nejmenší soubor v zadaném adresářovém stromu voláním Min nebo Max metodou místo 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  

Pokud potřebujete spočítat pouze počet bajtů v zadaném adresářovém stromu, můžete to udělat efektivněji bez vytvoření dotazu LINQ, který způsobuje režii při vytváření kolekce seznamů jako zdroje dat. Užitečnost přístupu LINQ se zvyšuje s tím, jak se dotaz stává složitějším nebo když potřebujete spustit více dotazů na stejný zdroj dat.

Dotaz volá samostatnou metodu pro získání délky souboru. To dělá, aby spotřeboval možnou výjimku, která bude vyvolána, pokud byl soubor odstraněn v jiném vlákně po FileInfo vytvoření objektu ve volání GetFiles. I když FileInfo objekt již byl vytvořen, může dojít k výjimce, protože FileInfo se objekt pokusí aktualizovat jeho Length vlastnost s nejaktuálnější délkou při prvním přístupu k vlastnosti. Když tuto operaci umístíte do bloku try-catch mimo dotaz, kód se řídí pravidlem, kterým se v dotazech zabrání operacím, které můžou způsobit vedlejší účinky. Obecně platí, že při používání výjimek je potřeba zajistit, aby aplikace nebyla ponechána v neznámém stavu.

Kompilace kódu

Vytvořte projekt konzolové aplikace jazyka Visual Basic s příkazem Imports pro obor názvů System.Linq.

Viz také