Postupy: Vytvoření dotazu na celkový počet bajtů v sadě složek (LINQ)
Tento příklad ukazuje, jak získat celkový počet bajtů použitých pro všechny soubory v zadané složce a jejích podsložkách.
Příklad
Sum Metoda přidá hodnoty všech položek v select klauzule.Můžete snadno změnit tento dotaz k načtení souboru největší nebo nejmenší v zadaném adresáři stromu voláním Min``1 nebo Max``1 metody namísto Sum.
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
class QuerySize
{
public static void Main()
{
string startFolder = @"c:\program files\Microsoft Visual Studio 9.0\VC#";
// Take a snapshot of the file system.
// This method assumes that the application has discovery permissions
// for all folders under the specified path.
IEnumerable<string> fileList = System.IO.Directory.GetFiles(startFolder, "*.*", System.IO.SearchOption.AllDirectories);
var fileQuery = from file in fileList
select GetFileLength(file);
// Cache the results to avoid multiple trips to the file system.
long[] fileLengths = fileQuery.ToArray();
// Return the size of the largest file
long largestFile = fileLengths.Max();
// Return the total number of bytes in all the files under the specified folder.
long totalBytes = fileLengths.Sum();
Console.WriteLine("There are {0} bytes in {1} files under {2}",
totalBytes, fileList.Count(), startFolder);
Console.WriteLine("The largest files is {0} bytes.", largestFile);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
// This method is used to swallow the possible exception
// that can be raised when accessing the System.IO.FileInfo.Length property.
static long GetFileLength(string filename)
{
long retval;
try
{
System.IO.FileInfo fi = new System.IO.FileInfo(filename);
retval = fi.Length;
}
catch (System.IO.FileNotFoundException)
{
// If a file is no longer present,
// just add zero bytes to the total.
retval = 0;
}
return retval;
}
}
Pokud máte pouze počet bajtů v zadaném adresáři stromu, provedete efektivněji bez vytvoření LINQ dotazu náročnější vytváření kolekce seznamu jako zdroj dat.Užitečnost LINQ přístup zvýší stane složitější dotaz, nebo když máte stejný zdroj dat spustit více dotazů.
Dotaz volání zvláštní metody získání délku souboru.Je to pro možnou výjimkou, že bude aktivována, pokud byl soubor odstraněn jiným podprocesem po spotřebovat FileInfo objekt byl vytvořen při volání GetFiles.I když FileInfo objekt již byl vytvořen, výjimky může dojít, protože FileInfo objektu se pokusí aktualizovat jeho Length vlastnost s aktuální délka první vlastnost je přístupná.Uložením této operace v bloku try-catch mimo dotaz následuje kód pravidla vyhnout operací v dotazech, které mohou způsobit vedlejší účinky.Obecně velmi pečlivě je třeba využívat výjimky, ujistěte se, že aplikace není ponecháno v neznámém stavu.
Probíhá kompilace kódu
Vytvoření Visual Studio projektu, který se zaměřuje.NET Framework verze 3.5.Projekt obsahuje odkaz na System.Core.dll a using směrnice (C#) nebo Imports prohlášení (Visual Basic) pro výchozí obor názvů System.Linq.V jazyce C# projekty, přidejte using směrnice pro obor názvů System.IO.
Zkopírujte tento kód do projektu.
Stisknutím klávesy F5 sestavit a spustit program.
Stisknutím libovolné klávesy uzavřete okno konzoly.
Robustní programování
Operace dotazu intenzivní nad obsah více typů dokumentů a souborů, zvažte použití Windows Desktop Search motoru.