Bagikan melalui


Cara: Mengkueri File atau File Terbesar di Pohon Direktori (LINQ) (Visual Basic)

Contoh ini menunjukkan lima kueri yang terkait dengan ukuran file dalam byte:

  • Cara mendapatkan ukuran dalam byte dari file terbesar.

  • Cara memperoleh ukuran dalam byte dari file terkecil.

  • Cara mengambil FileInfo file terbesar atau terkecil objek dari satu atau beberapa folder di bawah folder akar tertentu.

  • Cara mengambil urutan seperti 10 file terbesar.

  • Cara mengurutkan file ke dalam grup berdasarkan ukuran file mereka dalam byte, mengabaikan file yang kurang dari ukuran yang ditentukan.

Contoh

Contoh berikut berisi lima kueri terpisah yang memperlihatkan cara mengkueri dan mengelompokkan file, bergantung pada ukuran filenya dalam byte. Anda dapat dengan mudah mengubah contoh-contoh ini untuk mendasarkan kueri pada beberapa properti FileInfo objek lainnya.

Module QueryBySize  
    Sub Main()  
  
        ' Change the drive\path if necessary  
        Dim root As String = "C:\Program Files\Microsoft Visual Studio 9.0"  
  
        'Take a snapshot of the folder contents  
        Dim dir As New System.IO.DirectoryInfo(root)  
        Dim fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories)  
  
        ' Return the size of the largest file  
        Dim maxSize = Aggregate aFile In fileList Into Max(GetFileLength(aFile))  
  
        'Dim maxSize = fileLengths.Max  
        Console.WriteLine("The length of the largest file under {0} is {1}", _  
                          root, maxSize)  
  
        ' Return the FileInfo object of the largest file  
        ' by sorting and selecting from the beginning of the list  
        Dim filesByLengDesc = From file In fileList _  
                              Let filelength = GetFileLength(file) _  
                              Where filelength > 0 _  
                              Order By filelength Descending _  
                              Select file  
  
        Dim longestFile = filesByLengDesc.First  
  
        Console.WriteLine("The largest file under {0} is {1} with a length of {2} bytes", _  
                          root, longestFile.FullName, longestFile.Length)  
  
        Dim smallestFile = filesByLengDesc.Last  
  
        Console.WriteLine("The smallest file under {0} is {1} with a length of {2} bytes", _  
                                root, smallestFile.FullName, smallestFile.Length)  
  
        ' Return the FileInfos for the 10 largest files  
        ' Based on a previous query, but nothing is executed  
        ' until the For Each statement below.  
        Dim tenLargest = From file In filesByLengDesc Take 10  
  
        Console.WriteLine("The 10 largest files under {0} are:", root)  
  
        For Each fi As System.IO.FileInfo In tenLargest  
            Console.WriteLine("{0}: {1} bytes", fi.FullName, fi.Length)  
        Next  
  
        ' Group files according to their size,  
        ' leaving out the ones under 200K  
        Dim sizeGroups = From file As System.IO.FileInfo In fileList _  
                         Where file.Length > 0 _  
                         Let groupLength = file.Length / 100000 _  
                         Group file By groupLength Into fileGroup = Group _  
                         Where groupLength >= 2 _  
                         Order By groupLength Descending  
  
        For Each group In sizeGroups  
            Console.WriteLine(group.groupLength + "00000")  
  
            For Each item As System.IO.FileInfo In group.fileGroup  
                Console.WriteLine("   {0}: {1}", item.Name, item.Length)  
            Next  
        Next  
  
        ' 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.  
    ' In this particular case, it is safe to ignore the exception.  
    Function GetFileLength(ByVal fi As System.IO.FileInfo) As Long  
        Dim retval As Long  
        Try  
            retval = fi.Length  
        Catch ex As FileNotFoundException  
            ' If a file is no longer present,  
            ' just return zero bytes.
            retval = 0  
        End Try  
  
        Return retval  
    End Function  
End Module  

Untuk mengembalikan satu atau beberapa objek lengkap FileInfo , kueri terlebih dahulu harus memeriksa masing-masing objek di sumber data, lalu mengurutkannya berdasarkan nilai properti Panjangnya. Kemudian dapat mengembalikan satu elemen atau urutan dengan elemen terpanjang. Gunakan First untuk mengembalikan elemen pertama dalam daftar. Gunakan Take untuk mengembalikan jumlah n elemen pertama. Tentukan urutan pengurutan turun untuk menempatkan elemen terkecil di awal daftar.

Kueri menggunakan metode terpisah untuk mendapatkan ukuran file dalam byte untuk menangani kemungkinan pengecualian yang akan terjadi jika file dihapus pada utas lain dalam periode waktu sejak objek FileInfo dibuat dalam panggilan ke GetFiles. Meskipun FileInfo objek telah dibuat, pengecualian dapat terjadi karena FileInfo objek akan mencoba menyegarkan propertinya Length dengan menggunakan ukuran terbaru dalam byte saat properti tersebut pertama kali telah diakses. Dengan menempatkan operasi ini dalam blok try-catch di luar kueri, kami mengikuti prinsip untuk menghindari operasi dalam kueri yang dapat menyebabkan efek samping. Secara umum, perhatian besar harus diambil saat menangani pengecualian, untuk memastikan bahwa aplikasi tidak dibiarkan dalam keadaan yang tidak jelas.

Mengkompilasi kode

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

Lihat juga