我们能在Windows中删除打开的文件吗?

时间:2010-07-08 09:41:29

标签: windows

免责声明:我主要是一名linux / web开发人员。

Windows具有此“好”功能,它拒绝删除任何进程保持打开的任何文件的权限。因此,如果防病毒软件在错误的时间遇到​​错误的文件,则某些随机程序可能会出错并且可能会崩溃。

我是对的吗?有计划解决这个问题吗?

你们中的任何人都认为这是可以接受的,或者,当时它怎么可能看起来好主意呢?

编辑:

它在Unix上的工作方式非常不同,并且已经存在了几十年。

举个例子:

  • 进程1打开foo.txt,进行读取或写入,或两者兼而有之,
  • 进程2删除文件
  • 该文件已从文件系统取消链接
  • 进程1保持读取和/或写入,文件仍然存在,只要磁盘上有空间,它就可以增长。它只是从其他尚未处理文件句柄的进程中无法访问。
  • 当进程1关闭文件时,无法从任何地方访问

实际上,Unix上临时文件的常见用法是:open-remove-read / write-close。

2 个答案:

答案 0 :(得分:6)

您的初始陈述不正确。 Windows确实允许删除打开的文件。你只需要指定FILE_SHARE_DELETE就可以了。细心的程序员应明智地决定该标志(或读/写共享)是否有意义并通过它。

无法打开启用了完全共享(包括删除)的文件的反病毒产品存在问题。

但是,Windows会记住任何进程的当前工作目录并阻止其被删除。此工作目录与进程打开的任何文件的位置无关。

答案 1 :(得分:0)

这是完全可以接受的。想象一下,您正在读取应用程序中的数据库文件,并且其他一些应用程序出现并从您右下方删除该数据库文件。您的应用程序如何知道检查文件是否仍然存在?它将如何确保文件流不会突然尝试读取该文件可能只有一毫秒,而不是下一个?这就是为什么程序可以锁定文件,以确保文件始终存在,直到程序确定它已完成为止。

告诉我们为什么在您的情况下这种文件锁定是不合需要的可能会更有帮助。我非常确定反病毒程序会对文件进行乐观锁定,除非它正在清理它们。