Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieses Beispiel zeigt fünf Abfragen im Zusammenhang mit der Dateigröße in Bytes:
So rufen Sie die Größe in Byte der größten Datei ab.
So rufen Sie die Größe in Byte der kleinsten Datei ab.
So rufen Sie die FileInfo größte oder kleinste Objektdatei aus einem oder mehreren Ordnern unter einem angegebenen Stammordner ab.
So rufen Sie eine Sequenz wie die 10 größten Dateien ab.
So ordnen Sie Dateien basierend auf ihrer Dateigröße in Byte in Gruppen an, wobei Dateien ignoriert werden, die kleiner als eine angegebene Größe sind.
Beispiel
Das folgende Beispiel enthält fünf separate Abfragen, die zeigen, wie Dateien je nach ihrer Dateigröße in Byte abgefragt und gruppiert werden. Sie können diese Beispiele ganz einfach ändern, um die Abfrage auf eine andere Eigenschaft des FileInfo Objekts zu basieren.
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
Um ein oder mehrere vollständige FileInfo Objekte zurückzugeben, muss die Abfrage zuerst die einzelnen Objekte in der Datenquelle untersuchen und dann nach dem Wert ihrer Length-Eigenschaft sortieren. Anschließend kann sie die einzelne oder die Sequenz mit den größten Längen zurückgeben. Verwenden Sie First, um das erste Element in einer Liste zurückzugeben. Verwenden Sie Take, um die ersten n Elemente zurückzugeben. Geben Sie eine absteigende Sortierreihenfolge an, um die kleinsten Elemente am Anfang der Liste zu platzieren.
Die Abfrage ruft eine separate Methode auf, um die Dateigröße in Byte abzurufen, um die mögliche Ausnahme abzufangen, die ausgelöst wird, wenn eine Datei in einem anderen Thread im Zeitraum gelöscht wurde, seit das FileInfo-Objekt im Rahmen des Aufrufs an GetFiles
erstellt wurde. Auch wenn das FileInfo Objekt bereits erstellt wurde, kann die Ausnahme auftreten, da ein FileInfo Objekt versucht, seine Length Eigenschaft zu aktualisieren, indem die aktuellste Größe in Bytes verwendet wird, wenn zum ersten Mal auf die Eigenschaft zugegriffen wird. Durch das Einfügen dieses Vorgangs in einen Try-Catch-Block außerhalb der Abfrage folgen wir der Regel, Vorgänge in Abfragen zu vermeiden, die Nebenwirkungen verursachen können. Im Allgemeinen muss bei der Verwendung von Ausnahmen große Sorgfalt ergriffen werden, um sicherzustellen, dass eine Anwendung nicht in einem unbekannten Zustand verbleibt.
Kompilieren des Codes
Erstellen Sie ein Visual Basic-Konsolenanwendungsprojekt mit einer Imports
Anweisung für den System.Linq-Namespace.