如何使Windows文件锁定更像UNIX文件锁定?

时间:2009-02-13 16:06:03

标签: windows unix

UNIX文件锁定非常简单:操作系统假定您知道自己在做什么并让您按照自己的意愿行事:

例如,如果您尝试删除另一个进程已打开的文件,操作系统通常会让您这样做。原始进程仍然保留它的文件句柄,直到它终止 - 此时文件系统将悄悄地重新循环磁盘资源。不用大惊小怪,这就是我喜欢的方式。

Windows上的不同之处:如果我尝试删除另一个进程正在使用的文件,则会出现操作系统错误。该文件是不可触及的,直到原始进程释放它对文件的锁定。在MS-DOS的单用户时代,当任何锁定进程可能在包含文件的同一台计算机上时,这是很棒的,但是在网络上这是一场噩梦:

考虑在写入Windows文件服务器上的共享文件时进程挂起时会发生什么。在删除文件之前,我们必须找到计算机并在最初打开文件的计算机上标识进程。只有这样我们才能杀死进程并删除我们不需要的文件。

多么令人讨厌!

有没有办法让这更好?我想要的是Windows上的文件锁定在UNIX中表现得像文件锁定。我希望操作系统让我做我想做的事情,因为我负责,我知道我在做什么......

......那可以吗?

4 个答案:

答案 0 :(得分:8)

根据MSDN,您可以指定CreateFile()第3个参数(dwSharedMode)共享模式标志FILE_SHARE_DELETE,其中:

  

在文件或设备上启用后续打开操作以请求删除访问权。

     

否则,如果其他进程请求删除访问权限,则无法打开文件或设备。

     

如果未指定此标志,但已打开文件或设备以进行删除访问,则该功能将失败。

     

注意删除访问权限允许删除和重命名操作。

http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

因此,如果您可以控制您的应用程序,则可以使用此标记。

答案 1 :(得分:8)

没有。 Windows是专为“普通用户”设计的,即那些对计算机一无所知的人。因此,操作系统试图明智地避免PEBKAC。引用比尔盖茨的话:“Windows没有任何问题需要修复的问题。”当然,他知道99.9999%的Windows用户无法判断该程序是否因为他们或编写它的人而做了一些奇怪的事情。

当世界变得更加简单并且任何人都足够接近计算机来触摸它时,设计了Unix,可能知道如何从肮脏的沙子中组装它。因此,操作系统通常会让你做你想做的事情,因为它假设你知道的更好(如果你没有,你将会下次)。

技术答案:如果您创建文件,Unix会分配“i-nodes”。 I节点可以在进程之间共享。如果两个进程创建相同的文件(即两个进程使用相同的路径调用create()),那么最终会有两个i节点。这是设计的。它允许一个奇特的安全功能:您可以创建没有人可以打开但自己的文件:

  1. 打开文件
  2. 删除它(但保留文件句柄)
  3. 以您喜欢的方式使用文件
  4. 关闭文件
  5. 在步骤#2之后,Universe中唯一可以访问该文件的进程是创建它的进程(除非您希望逐块读取硬盘)。操作系统将保持数据存活,直到您关闭文件或进程终止(此时Unix将在您之后清理)。

    此设计是所有Unix文件系统的基础。 Windows文件系统NTFS的工作方式大致相同,但高级API不同。许多应用程序以独占模式打开文件(这可以阻止任何人,甚至是备份程序)来读取文件。对于仅显示PDF查看器等信息的应用程序,情况甚至如此。

    这意味着您必须修复所有Windows 应用程序才能达到预期效果。如果您有权访问源,则可以在共享模式下创建文件。这将允许其他进程同时访问它,但是,如果文件仍然存在,是否有人进行了更改等,则必须在每次读/写之前进行检查。

答案 2 :(得分:3)

请注意,Process Explorer允许通过Handle强制关闭文件句柄(对于运行它的框的本地进程) - >关闭手柄。

Unlocker声称可以做更多事情,并提供其他工具的有用列表。

同样在重启时删除是一个选项(虽然这听起来不是你想要的)

答案 3 :(得分:1)

如果挂起的进程仍然打开句柄,这实际上没有用。在挂起进程释放句柄之前,它不会释放资源。但无论如何,在Windows中,可以强制关闭正在使用它的进程下的文件。来自sysinternals.com的Process Explorer将允许您查看并关闭进程已打开的句柄。