Aracılığıyla paylaş


Nasıl yapılır: Bir Klasör Kümesindeki Toplam Bayt Sayısını Sorgulama (LINQ) (Visual Basic)

Bu örnekte, belirtilen bir klasördeki tüm dosyalar ve tüm alt klasörleri tarafından kullanılan toplam bayt sayısının nasıl alındığı gösterilmektedir.

Örnek

yöntemi, Sum yan tümcesinde select seçilen tüm öğelerin değerlerini ekler. Bu sorguyu, yerine Minveya Max yöntemini çağırarak Sum belirtilen dizin ağacındaki en büyük veya en küçük dosyayı alacak şekilde kolayca değiştirebilirsiniz.

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  

Yalnızca belirtilen dizin ağacındaki bayt sayısını saymak zorundaysanız, bunu bir LINQ sorgusu oluşturmadan daha verimli bir şekilde yapabilirsiniz ve bu da liste koleksiyonunu veri kaynağı olarak oluşturma yükünü doğurur. Sorgu daha karmaşık hale geldikçe veya aynı veri kaynağında birden çok sorgu çalıştırmanız gerektiğinde LINQ yaklaşımının kullanışlılığı artar.

Sorgu, dosya uzunluğunu elde etmek için ayrı bir yönteme çağrır. Başka bir iş parçacığında nesne çağrısında FileInfo oluşturulduktan sonra dosya silinirse ortaya çıkacak olası bir özel durumu yakalamak için GetFiles bunu yapar. Nesne FileInfo zaten oluşturulmuş olmasına rağmen, hata oluşabilir çünkü bir FileInfo nesnesi, Length özelliğine ilk kez erişildiğinde özelliğini en güncel uzunlukla yenilemeye çalıştığında. Kod, bu işlemi sorgunun dışındaki bir try-catch bloğuna yerleştirerek, yan etkilere neden olabilecek sorgulardaki işlemlerden kaçınma kuralını izler. Genel olarak, bir uygulamanın bilinmeyen bir durumda bırakılmadığından emin olmak için istisnaları işlerken büyük özen gösterilmelidir.

Kodu derleme

System.Linq ad alanı bildirimi içeren bir Imports Visual Basic konsol uygulaması projesi oluşturun.

Ayrıca bakınız