Cara mengkueri jumlah total byte dalam sekumpulan folder (LINQ) (C#)

Contoh ini menunjukkan cara mengambil jumlah total byte yang digunakan oleh semua file dalam folder tertentu dan semua subfoldernya.

Contoh

Metode Sum menambahkan nilai semua item yang dipilih dalam klausul select. Anda dapat dengan mudah mengubah kueri ini untuk mengambil file terbesar atau terkecil dalam pohon direktori yang ditentukan dengan memanggil metode Min atau Max alih-alih Sum.

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);  
    }  
  
    // 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;  
    }  
}  

Jika Anda hanya perlu menghitung jumlah byte dalam pohon direktori tertentu, Anda dapat melakukannya dengan lebih efisien tanpa membuat kueri LINQ, yang menimbulkan overhead pembuatan kumpulan daftar sebagai sumber data. Kegunaan pendekatan LINQ meningkat saat kueri menjadi makin kompleks, atau saat Anda harus menjalankan beberapa kueri terhadap sumber data yang sama.

Kueri memanggil metode terpisah untuk memperoleh panjang file. Hal tersebut dilakukan untuk menggunakan kemungkinan pengecualian yang akan ditampilkan jika file dihapus pada utas lain setelah objek FileInfo dibuat dalam panggilan untuk GetFiles. Meski objek FileInfo telah dibuat, pengecualian dapat terjadi karena objek FileInfo akan mencoba menyegarkan properti Lengthdengan panjang terbaru saat pertama kali properti diakses. Dengan menempatkan operasi ini dalam blok try-catch di luar kueri, kode mengikuti aturan menghindari operasi dalam kueri yang dapat menyebabkan efek samping. Secara umum, perhatian besar harus diambil ketika Anda menggunakan pengecualian untuk memastikan bahwa aplikasi tidak dibiarkan dalam keadaan tidak diketahui.

Mengompilasi Kode

Buat proyek aplikasi konsol C#, dengan arahan using untuk namespace layanan System.Linq dan System.IO.