Llo*_*ell 15 .net c# asp.net winforms
我希望能够使用C#获取其中一个本地目录的大小.我试图避免以下(伪代码),虽然在最坏的情况下我将不得不满足于此:
int GetSize(Directory)
{
int Size = 0;
foreach ( File in Directory )
{
FileInfo fInfo of File;
Size += fInfo.Size;
}
foreach ( SubDirectory in Directory )
{
Size += GetSize(SubDirectory);
}
return Size;
}
Run Code Online (Sandbox Code Playgroud)
基本上,是否有可以在某处使用Walk()以便我可以遍历目录树?这将保存通过每个子目录的递归.
Kev*_*Kev 34
在.net 4.0中获取文件夹大小的一种非常简洁的方法如下.它仍然受到必须以递归方式遍历所有文件的限制,但它不会加载潜在的大量文件名,而且只有两行代码.
private static long GetDirectorySize(string folderPath)
{
DirectoryInfo di = new DirectoryInfo(folderPath);
return di.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(fi => fi.Length);
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 19
如果你使用Directory.GetFiles你可以做一个递归搜索(使用SearchOption.AllDirectories),但这有点片状(特别是如果你没有访问其中一个子目录) - 并可能涉及一个巨大的单个阵列回来(警告klaxon ...).
我会对递归方法感到满意,除非我能够显示(通过分析)瓶颈; 然后我可能会切换到(单级)Directory.GetFiles,使用Queue<string>模拟递归.
请注意,.NET 4.0引入了一些基于枚举器的文件/目录列表方法,这些方法可以节省大数组.
这是我的.NET 4.0方法
public static long GetFileSizeSumFromDirectory(string searchDirectory)
{
var files = Directory.EnumerateFiles(searchDirectory);
// get the sizeof all files in the current directory
var currentSize = (from file in files let fileInfo = new FileInfo(file) select fileInfo.Length).Sum();
var directories = Directory.EnumerateDirectories(searchDirectory);
// get the size of all files in all subdirectories
var subDirSize = (from directory in directories select GetFileSizeSumFromDirectory(directory)).Sum();
return currentSize + subDirSize;
}
Run Code Online (Sandbox Code Playgroud)
甚至更好:
// get IEnumerable from all files in the current dir and all sub dirs
var files = Directory.EnumerateFiles(searchDirectory,"*",SearchOption.AllDirectories);
// get the size of all files
long sum = (from file in files let fileInfo = new FileInfo(file) select fileInfo .Length).Sum();
Run Code Online (Sandbox Code Playgroud)
正如Gabriel指出,如果您在searchDirectory下有一个受限制的目录,这将失败!
| 归档时间: |
|
| 查看次数: |
27999 次 |
| 最近记录: |