要求:在合理的时间范围内获取文件夹或远程计算机的大小。
WMI耗尽太长时间来枚举目录,然后计算其内容的大小。
我尝试了以下代码,但它说它不是有效的路径
String Folder = Row["Location"].ToString();
String[] Files = Directory.GetFiles(@"\\" + Folder.Remove(0, 2) + @"\c$" + Folder, "*", SearchOption.AllDirectories);
long TotalFolderSize = 0;
foreach (String File in Files)
{
TotalFolderSize += new FileInfo(File).Length;
}
我对PInvoke
并不是那么好,对C#来说还不是很新。我看到Kernel32.dll
有一些文件和磁盘调用,但无法找到有关文件夹或目录的任何内容。
所以问题是
C#中是否有API /函数可以通过网络获取目录的大小。
您是否可以使用PInvoke调用来执行此操作
最好的方法是什么?
答案 0 :(得分:1)
使用Directory
和FileInfo
类。
可以找到代码示例和更多信息here:
static long GetDirectorySize(string p)
{
// 1.
// Get array of all file names.
string[] a = Directory.GetFiles(p, "*", SearchOption.AllDirectories);
// 2.
// Calculate total bytes of all files in a loop.
long b = 0;
foreach (string name in a)
{
// 3.
// Use FileInfo to get length of each file.
FileInfo info = new FileInfo(name);
b += info.Length;
}
// 4.
// Return total size
return b;
}
答案 1 :(得分:1)
对于网络共享,您的方法是正确的,因为您无法访问任何“更快”方法的基础文件系统。但是,您的代码存在一些问题,以下内容显示了基础知识:
string networkPath = @"\\sgb8532fh92\AppData\PCUWEB";
DirectoryInfo di = new DirectoryInfo(networkPath);
long totalSize = 0;
foreach (FileInfo fi in di.GetFiles())
{
totalSize += fi.Length;
}
Console.WriteLine("Total Size: {0}Mb", totalSize / 1024 / 1024);
Console.ReadLine();
另请注意,这只会返回文件夹中文件的大小,而不会返回任何子文件夹。为此,我会看一下递归。