Udostępnij za pośrednictwem


Porady: zapytanie o całkowitą liczbę bajtów w zestawie folderów (LINQ)

Ten przykład pokazuje, jak pobrać całkowita liczba bajtów używanych przez wszystkie pliki w określonym folderze i wszystkich jego podfolderów.

Przykład

Sum Metoda dodaje wartości elementów zaznaczonych w select klauzuli.Można łatwo zmodyfikować tę kwerendę, aby pobrać plik największą i najmniejszą, w drzewie katalogu określonego przez wywołanie Min``1 lub Max``1 metoda 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
class QuerySize
{
    public static void Main()
    {
        string startFolder = @"c:\program files\Microsoft Visual Studio 9.0\VC#";

        // Take a snapshot of the file system. 
        // This method assumes that the application has discovery permissions 
        // for all folders under the specified path.
        IEnumerable<string> fileList = System.IO.Directory.GetFiles(startFolder, "*.*", System.IO.SearchOption.AllDirectories);

        var fileQuery = from file in fileList
                        select GetFileLength(file);

        // Cache the results to avoid multiple trips to the file system. 
        long[] fileLengths = fileQuery.ToArray();

        // Return the size of the largest file 
        long largestFile = fileLengths.Max();

        // Return the total number of bytes in all the files under the specified folder. 
        long totalBytes = fileLengths.Sum();

        Console.WriteLine("There are {0} bytes in {1} files under {2}",
            totalBytes, fileList.Count(), startFolder);
        Console.WriteLine("The largest files is {0} bytes.", largestFile);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }

    // This method is used to swallow the possible exception 
    // that can be raised when accessing the System.IO.FileInfo.Length property. 
    static long GetFileLength(string filename)
    {
        long retval;
        try
        {
            System.IO.FileInfo fi = new System.IO.FileInfo(filename);
            retval = fi.Length;
        }
        catch (System.IO.FileNotFoundException)
        {
            // If a file is no longer present, 
            // just add zero bytes to the total.
            retval = 0;
        }
        return retval;
    }
}

Jeśli masz tylko policzyć liczbę bajtów w drzewie określony katalog, tym bardziej wydajnie bez tworzenia LINQ kwerendę, która wiąże się obciążenie tworzenia kolekcji listy jako źródło danych.Przydatność LINQ podejście zwiększa kwerendy staje się bardziej złożone lub wykonywane są kwerendy wielu tego samego źródła danych.

Kwerendy wzywa do oddzielnych metody, aby uzyskać długość pliku.Robi to, aby zużywają możliwe wyjątek, który będzie uruchamiany, jeśli plik został usunięty w innym wątku po FileInfo w wywołaniu w celu utworzenia obiektu GetFiles.Mimo że FileInfo obiekt już istnieje, może wystąpić wyjątek ponieważ FileInfo obiektu spróbować odświeżyć jego Length właściwość z najbardziej aktualną długość właściwość jest dostępna po raz pierwszy.Umieszczenie tej operacji w bloku try-catch poza kwerendy, kod następuje reguła unikanie operacji w kwerendach, które mogą wywoływać efekty uboczne.Ogólnie rzecz biorąc great należy uważać podczas zużywają wyjątki, aby upewnić się, że aplikacja nie pozostaje w nieznanym stanie.

Kompilowanie kodu

  • Tworzenie Visual Studio projekt, który jest przeznaczony.NET Framework w wersji 3.5.Projekt zawiera odwołanie do System.Core.dll i using dyrektywy (C#) lub Imports instrukcji (Visual Basic) dla nazw System.Linq domyślnie.W języku C# projektów, należy dodać using dyrektywa obszaru nazw System.IO.

  • Skopiuj ten kod do projektu.

  • Naciśnij klawisz F5, aby skompilować i uruchomić program.

  • Naciśnij dowolny klawisz, aby zamknąć okno konsoli.

Stabilne programowanie

Kwerendy intensywnych operacji nad zawartość wielu rodzajów dokumentów i plików, należy rozważyć użycie Wyszukiwanie z pulpitu systemu Windows silnika.

Zobacz też

Koncepcje

LINQ do obiektów

LINQ i katalogi plików