Bagikan melalui


Cara: Mengkueri Jumlah Total Byte dalam Sekumpulan Folder (LINQ) (Visual Basic)

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

Contoh

Metode Sum menambahkan nilai dari semua item yang dipilih dalam klausa select. Anda dapat dengan mudah mengubah kueri ini untuk mengambil file terbesar atau terkecil di pohon direktori yang ditentukan dengan memanggil Min metode atau Max alih-alih 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  

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

Kueri memanggil metode terpisah untuk mendapatkan panjang file. Ini dilakukan untuk menangani kemungkinan pengecualian yang akan terjadi jika file dihapus pada utas lain setelah objek FileInfo dibuat dalam panggilan ke GetFiles. Meskipun FileInfo objek telah dibuat, pengecualian dapat terjadi karena FileInfo objek akan mencoba me-refresh propertinya Length dengan panjang paling baru saat ini saat properti diakses pertama kali. Dengan menempatkan operasi ini di 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.

Mengkompilasi kode

Buat proyek aplikasi konsol Visual Basic, dengan pernyataan Imports untuk namespace System.Linq.

Lihat juga