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.
In diesem Beispiel wird gezeigt, wie sie die Gesamtanzahl der Bytes abrufen, die von allen Dateien in einem angegebenen Ordner und allen unterordnern verwendet werden.
Beispiel
Die Sum Methode fügt die Werte aller elemente hinzu, die in der select Klausel ausgewählt sind. Sie können diese Abfrage ganz einfach ändern, um die größte oder kleinste Datei in der angegebenen Verzeichnisstruktur abzurufen, indem Sie die Methode Min oder Max anstelle von Sum aufrufen.
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
Wenn Sie nur die Anzahl der Bytes in einer angegebenen Verzeichnisstruktur zählen müssen, können Sie dies effizienter ausführen, ohne eine LINQ-Abfrage zu erstellen, was den Aufwand für die Erstellung der Listensammlung als Datenquelle verursacht. Die Nützlichkeit des LINQ-Ansatzes erhöht sich, wenn die Abfrage komplexer wird, oder wenn Sie mehrere Abfragen für dieselbe Datenquelle ausführen müssen.
Die Abfrage ruft eine separate Methode auf, um die Dateilänge abzurufen. Dies geschieht, um die mögliche Ausnahme aufzufangen, die ausgelöst wird, wenn die Datei in einem anderen Thread gelöscht wurde, nachdem das FileInfo-Objekt im Aufruf von GetFiles erstellt wurde. Obwohl das FileInfo Objekt bereits erstellt wurde, kann die Ausnahme auftreten, da ein FileInfo Objekt versucht, seine Length Eigenschaft mit der aktuellsten Länge beim ersten Zugriff auf die Eigenschaft zu aktualisieren. Indem Sie diesen Vorgang in einen Try-Catch-Block außerhalb der Abfrage einfügen, folgt der Code der Regel, Vorgänge in Abfragen zu vermeiden, die Nebenwirkungen verursachen können. Im Allgemeinen ist beim Abfangen von Ausnahmen große Sorgfalt geboten, um sicherzustellen, dass Anwendungen nicht in einem unbekannten Zustand verbleiben.
Kompilieren des Codes
Erstellen Sie ein Visual Basic-Konsolenanwendungsprojekt mit einer Imports Anweisung für den System.Linq-Namespace.