File.Delete和Directory.Delete网络性能

时间:2012-02-27 14:37:48

标签: c# file-io

有人知道File.DeleteDirectory.Delete的执行方式吗?

我的意思是:如果假设我要通过网络删除某些文件/文件夹并且网络速度相当慢,会发生什么?

它会像在本地一样快完成吗?是否会比将文件移动到该网络位置消耗更多带宽?

6 个答案:

答案 0 :(得分:1)

它不会像本地那么快。它会很慢,延迟取决于您的网络条件。

您不会将Delete命令“远程”发送到“智能终端”,后者知道如何将文件夹删除为原子操作。您的代码实际上是针对“dumb”的网络位置运行并逐个文件删除。

至于你的上一个问题,Delete几乎总是比Move快。当你跨磁盘移动文件时(当然还有跨网络位置),它实际上是一个复制操作(在它的末尾有'删除')。

答案 1 :(得分:1)

他们都调用了win32 api来做工作,

这是来自反射器7:

[SecuritySafeCritical]
public static void Delete(string path)
{
    if (path == null)
    {
        throw new ArgumentNullException("path");
    }
    string fullPathInternal = Path.GetFullPathInternal(path);
    new FileIOPermission(FileIOPermissionAccess.Write, new string[] { fullPathInternal }, false, false).Demand();
    if (!Win32Native.DeleteFile(fullPathInternal))
    {
        int errorCode = Marshal.GetLastWin32Error();
        if (errorCode != 2)
        {
            __Error.WinIOError(errorCode, fullPathInternal);
        }
    }
}

答案 2 :(得分:1)

  

它会像在本地一样快完成吗?

不,它很慢,因为Windows中没有删除目录 - Directory.Delete列出网络上的所有文件,然后删除它们。与Windows资源管理器相同。根据文件数量的不同,这可能需要一些时间。删除30.000个文件首先列出它们然后是30.000个单独的删除操作。

  

它会比将文件移动到该网络位置消耗更多带宽吗?

不,它不会因为文件永远不会被移动。复制文件总是比删除它们慢得多。

答案 3 :(得分:0)

它们都是同步运行的 - 也就是说,它们都会等待任务完成,然后再将控制权返回给调用者。因此,调用它们通过网络删除文件或目录需要更长的时间。

答案 4 :(得分:0)

它们基本上使用相应的本机Win32 API,这意味着性能几乎与本机应用程序相同(.NET和本机之间没有真正的区别)......

基本上,当在网络驱动器/路径/共享上完成时,所有文件I / O都会变慢 - 所以:是的,与本地执行的相同操作相比,它们会更慢。慢多少取决于几个方面,包括(但不限于)网络延迟,服务器,文件系统性能等。

答案 5 :(得分:0)

他们通过Win32 api包装调用。

通过这里的免费工具查看他们的功能。 ILSPY

或付费替代reflector