获取远程目录的文件夹大小

时间:2014-07-23 07:03:19

标签: c# io directory

要求:在合理的时间范围内获取文件夹或远程计算机的大小。

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有一些文件和磁盘调用,但无法找到有关文件夹或目录的任何内容。

所以问题是

  1. C#中是否有API /函数可以通过网络获取目录的大小。

  2. 您是否可以使用PInvoke调用来执行此操作

  3. 最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

使用DirectoryFileInfo类。

可以找到代码示例和更多信息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();

另请注意,这只会返回文件夹中文件的大小,而不会返回任何子文件夹。为此,我会看一下递归。