如何使Windows文件locking更像UNIX文件locking?

UNIX文件locking是非常简单的:操作系统假定你知道你在做什么,并让你做你想做的事情:

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

在Windows上有什么不同:如果我试图删除另一个进程正在使用的文件,我得到一个操作系统错误。 该文件是不可触摸的,直到原始进程释放它locking的文件。 在MS-DOS的单用户时代,当任何locking进程可能在包含这些文件的同一台计算机上时,这真是太棒了,但是在networking中,这是一场噩梦:

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

真讨厌!

有没有办法让这个更好? 我想要的是在Windows上进行文件locking,使其在UNIX中performance得像文件locking一样。 我希望操作系统能让我做我想做的事情,因为我负责,我知道我在做什么…

…可以这样做吗?

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

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

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

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

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

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

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

不。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 应用程序才能达到预期的效果。 如果您有权访问源,则可以使用共享模式创建文件。 这将允许其他进程同时访问它,但是,如果文件仍然存在,是否有人进行了更改等,则必须在每次读取/写入之前进行检查。

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

解锁器意图做更多,并提供了一个有用的其他工具列表。

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

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