1

在我维护的 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 没有说任何一种方式,如果有人可以提供帮助,我希望得到一个明确的意见:是否有必要在这些连续删除之间产生处理器?

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

4

1 回答 1

5

这是巫毒编程。通常受到程序员的启发,看到 File.Delete() 并不总是真正删除文件。在多任务操作系统上运行程序的一个相当不可避免的副作用,这种副作用也允许其他进程打开文件。

还有一类收缩包装的恶意软件,程序员自愿安装在他们的机器上,这可能会导致延迟。反恶意软件位居榜首,搜索索引器和云存储实用程序紧随其后。

他们使用 FileSharing.Delete 选项打开文件以尽量减少其影响。往往可以正常工作,直到您在删除文件后立即尝试重写文件。这不起作用,该文件处于“删除挂起”模式,并且您会遇到 UnauthorizedAccessException。

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

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

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

于 2015-09-23T10:05:19.967 回答