有人知道File.Delete
和Directory.Delete
的执行方式吗?
我的意思是:如果假设我要通过网络删除某些文件/文件夹并且网络速度相当慢,会发生什么?
它会像在本地一样快完成吗?是否会比将文件移动到该网络位置消耗更多带宽?
答案 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)