【问题标题】:File.Delete and Directory.Delete network performanceFile.Delete 和 Directory.Delete 网络性能
【发布时间】:2012-02-27 14:37:48
【问题描述】:

有人知道File.DeleteDirectory.Delete 是如何执行的吗?

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

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

【问题讨论】:

  • 删除操作如何比移动操作“消耗更多带宽”?你说的是哪种带宽?
  • 我知道比较移动和删除是无稽之谈。但只想知道删除与移动相比需要多少执行时间。我应该说得更清楚

标签: c# file-io


【解决方案1】:

它不会像本地那样快。它会很慢,延迟取决于您的网络状况。

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

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

【讨论】:

    【解决方案2】:

    他们都调用了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);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      它会和本地一样快吗?

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

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

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

      【讨论】:

      • shell中有rd-command用于删除目录。我不知道为什么 GUI 不使用相同的功能——也许是为了让用户有机会点击取消。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 几乎不是问题,是的,通过网络删除比本地删除要慢得多。
        • @TomTom 我怀疑您没有阅读我回答的第二段?
        • @TomTom 另一点:OP 问题的第一部分是关于我在第一段中回答的“它们如何执行”,其余问题是关于我在第二段中回答的性能...
        【解决方案6】:

        它们通过 Win32 api 包装调用。

        在此处通过免费工具查看它们的功能。 ILSPY

        或付费替代reflector

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-25
          • 2016-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多