是否有必要在连续的文件操作之间产生?

Is it necessary to yield between successive File operations?

在我维护的 C# 代码中,我一直看到这种模式:

File.Delete(string.Format("{0}/{1}.png", temp, ProductCode));
Thread.Sleep(20);
File.Delete(string.Format("{0}/{1}.pdf", temp, ProductCode));
Thread.Sleep(20);
File.Delete(string.Format("{0}/{1} - {2}.pdf", temp, ProductCode, ProductName));
Thread.Sleep(20);

MSDN 什么都没说,如果有人可以提供帮助,我想给出明确的意见:是否有必要在这些连续删除之间放弃处理器?

在这种特殊情况下,不可能有来自其他进程的锁;删除不会失败。但是,如果我在同一个线程上不间断地发出多个删除操作,我不确定是否会有适当的排队。

这是巫毒编程。通常受到程序员的启发,看到 File.Delete() 并不总是实际删除文件。 运行 程序在多任务操作系统上不可避免的副作用,这种副作用还可以让其他进程打开文件。

还有一类压缩包装的恶意软件,程序员自愿在他们的机器上安装,这可能会导致延迟。反恶意软件位于该列表的顶部,其次是搜索索引器和云存储实用程序。

他们使用 FileSharing.Delete 选项打开文件以尽量减少影响。趋于正常工作,直到您执行诸如在删除文件后立即重写文件之类的操作。这不起作用,文件处于 "delete pending" 模式,您会收到 UnauthorizedAccessException。

然后受害程序员往往会注意到 "waiting for a bit" 有助于避免异常。给其他进程足够的时间来完成它对文件所做的任何事情并关闭文件句柄。一旦最后一个句柄关闭,该文件实际上从文件系统中消失并且重新创建它不会失败。

睡眠 20 毫秒完全是任意的,而且不太可能足够。除了反复尝试,你永远不知道要等多久。 真正的问题是这个策略只是一种非常糟糕的重新创建文件的方法。先删除,再创建和写入文件是非常危险的。如前所述,删除工作正常但创建它是危险的。当出现此错误时,用户将无法获得该文件的副本。完整的数据丢失。从来都不是一个非常理想的程序功能:)

不要使用巫术。正确的做法是创建一个 new 文件,然后使用 File.Replace() 将其与旧文件交换,然后删除旧文件。永远不会丢失任何数据,恶意软件几乎无法解决这个问题。通过将文件移动到回收站来删除文件也是一种很好的方法,只要它不会经常发生,FileSystem.DeleteFile() 在每个人最喜欢的命名空间中。