Anvisningar: Fråga efter den största filen eller filerna i ett katalogträd (LINQ) (Visual Basic)
I det här exemplet visas fem frågor relaterade till filstorlek i byte:
Så här hämtar du storleken i byte för den största filen.
Så här hämtar du storleken i byte för den minsta filen.
Hämta objektets FileInfo största eller minsta fil från en eller flera mappar under en angiven rotmapp.
Så här hämtar du en sekvens, till exempel de 10 största filerna.
Så här beställer du filer i grupper baserat på deras filstorlek i byte och ignorerar filer som är mindre än en angiven storlek.
Exempel
Följande exempel innehåller fem separata frågor som visar hur du frågar och grupperar filer, beroende på filstorleken i byte. Du kan enkelt ändra de här exemplen för att basera frågan på någon annan egenskap för FileInfo objektet.
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
Om du vill returnera ett eller flera fullständiga FileInfo objekt måste frågan först undersöka var och en i datakällan och sedan sortera dem efter värdet för egenskapen Längd. Sedan kan den returnera den enda eller sekvensen med de största längderna. Använd First för att returnera det första elementet i en lista. Använd Take för att returnera det första n antalet element. Ange en fallande sorteringsordning för att placera de minsta elementen i början av listan.
Frågan anropar en separat metod för att hämta filstorleken i byte för att använda det möjliga undantag som utlöses om en fil togs bort i en annan tråd under tidsperioden FileInfo sedan objektet skapades i anropet till GetFiles
. Även om FileInfo objektet redan har skapats kan undantaget inträffa eftersom ett FileInfo objekt försöker uppdatera sin Length egenskap med den senaste storleken i byte första gången egenskapen används. Genom att placera den här åtgärden i ett try-catch-block utanför frågan följer vi regeln att undvika åtgärder i frågor som kan orsaka biverkningar. I allmänhet måste du vara mycket försiktig när du använder undantag för att se till att ett program inte lämnas i ett okänt tillstånd.
Kompilera koden
Skapa ett Visual Basic-konsolprogramprojekt med en Imports
instruktion för System.Linq-namnområdet.