2009-02-13 103 views
17

UNIX文件锁定是死简单:操作系统假设你知道你在做什么,让你做你想要什么:如何使Windows文件锁定更像UNIX文件锁定?

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

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

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

真是太讨厌了!

有没有办法让这个更好?我想要的是在Windows上进行文件锁定,使其在UNIX中的行为类似于文件锁定。我希望操作系统能够让我做我想做的事情,因为我负责并且知道自己在做什么......

......所以可以这样做吗?

+0

我严重怀疑它。操作系统中的程序可以继续访问已删除文件直到关闭它的Unix行为是深刻的。 – 2009-02-13 16:09:31

+0

对我来说,文件锁定意味着使用fcntl和LockFileEx。您正在询问是否有权打开或删除文件。 – 2009-02-13 16:49:50

回答

8

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

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

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

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

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

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

所以,如果你能控制你的应用程序,你可以使用此标志。

+0

这不是一种提供类Unix的解除链接的万能药。它只允许其他File对象引用来重命名文件或设置/取消设置其删除处置。设置删除处置不会取消链接文件。文件系统驱动程序的清理例程仅在最后一个句柄关闭时才会取消链接文件。这与Unix有很大的不同之处在于当试图删除一个包含正在使用的文件的目录时。假设这些文件是使用删除共享打开的,解决方法是将它们重命名为同一卷上的临时目录。 – eryksun 2017-10-19 15:36:36

7

编号Windows是为“普通用户”设计的,也就是那些对电脑不了解的人。因此,操作系统会尽量避免使用PEBKAC。引用比尔盖茨的话:“Windows没有任何问题需要修复。”当然,他知道99.9999%的Windows用户无法分辨出该程序是否因为他们或写这个程序的人而做了些奇怪的事情。

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

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

  1. 打开文件
  2. 将其删除(但保持文件句柄)
  3. 使用的文件,无论如何你像
  4. 关闭文件

第2步后,谁可以访问该文件宇宙中唯一的过程是谁创造了它(除非你想读块硬盘块)之一。操作系统会保持数据的活动状态,直到你关闭文件或者进程终止(在这之后Unix将会清理掉)。

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

这意味着你将必须解决所有的Windows应用程序达到预期的效果。如果您有权访问源,则可以使用共享模式创建文件。这将允许其他进程在同一时间访问,但届时,你将有充分的读前检查/写,如果该文件仍然存在,是否有人进行更改,等等

+1

我不认为这是如何工作的。同一个文件不能有两个inode。不同的inode,不同的文件。另外,你可以用procfs读取你想要的任何文件。 – 2009-02-13 16:42:53

1

并没有真正帮助,如果悬挂的过程仍然具有打开的手柄。在挂起的进程释放句柄之前,它不会释放资源。但无论如何,在Windows中,可能会强制关闭一个文件,而这个文件正在使用它。来自sysinternals.com的Process Explorer将让您查看并关闭进程已打开的句柄。

3

注意,Process Explorer中允许文件句柄的强制关闭(本地到要运行它的盒子进程)通过手柄 - >关闭句柄。

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

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