Aracılığıyla paylaş


Nasıl yapılır: Dizin Ağacındaki En Büyük Dosya veya Dosyaları Sorgulama (LINQ) (Visual Basic)

Bu örnekte, dosya boyutuyla ilgili beş sorgu bayt cinsinden gösterilir:

  • En büyük dosyanın bayt cinsinden boyutunu alma.

  • En küçük dosyanın bayt cinsinden boyutunu alma.

  • Belirtilen kök klasörün altındaki bir veya daha fazla klasörden en büyük veya en küçük nesne dosyasını alma FileInfo .

  • En büyük 10 dosya gibi dizileri geri alma.

  • Belirtilen boyuttan küçük dosyaları yoksayarak dosyaların bayt cinsinden dosya boyutuna göre gruplar halinde sıralanması.

Örnek

Aşağıdaki örnek, bayt cinsinden dosya boyutlarına bağlı olarak dosyaları sorgulamayı ve gruplandırma işlemini gösteren beş ayrı sorgu içerir. Sorguyu nesnenin başka bir özelliğine FileInfo dayandırmak için bu örnekleri kolayca değiştirebilirsiniz.

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  

Bir veya daha fazla tam FileInfo nesne döndürmek için sorgunun önce veri kaynağındaki her birini incelemesi ve ardından bunları Length özelliğinin değerine göre sıralaması gerekir. Ardından tek bir veya en büyük uzunluklara sahip diziyi döndürebilir. Listedeki ilk öğeyi döndürmek için kullanın First . İlk n öğe sayısını döndürmek için kullanın Take . Listenin başlangıcına en küçük öğeleri yerleştirmek için azalan bir sıralama düzeni belirtin.

Sorgu, FileInfo nesnesinin oluşturulduğu GetFiles çağrısından sonra geçen sürede bir dosyanın başka bir iş parçacığında silinmesi durumunda ortaya çıkabilecek olası özel durumu yakalamak için bayt cinsinden dosya boyutunu almak amacıyla ayrı bir yönteme çağrı yapar. Nesne zaten FileInfo oluşturulmuş olsa da, özel durum ortaya çıkabilir çünkü bir FileInfo nesne, özelliğine ilk kez erişildiğinde, en güncel bayt boyutunu kullanarak Length özelliğini yenilemeye çalışır. Bu işlemi sorgunun dışındaki bir try-catch bloğuna yerleştirerek, sorgularda yan etkilere neden olabilecek işlemlerden kaçınma kuralını uygularız. Genel olarak, bir uygulamanın bilinmeyen bir durumda bırakılmadığından emin olmak için özel durumlar kullanılırken 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