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

问题描述 投票:0回答:4

UNIX 文件锁定非常简单:操作系统假设您知道自己在做什么,并让您做您想做的事:

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

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

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

真麻烦!

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

...那可以吗?

windows unix file-locking
4个回答
12
投票

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


9
投票

根据 MSDN,您可以指定 CreateFile() 第三个参数 (dwSharedMode) 共享模式标志

FILE_SHARE_DELETE
其中:

允许对文件或设备进行后续打开操作以请求删除访问权限。

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

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

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

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

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


3
投票

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

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

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


1
投票

如果挂起的进程仍然打开句柄,那并没有什么帮助。在挂起的进程释放句柄之前,它不会释放资源。但无论如何,在 Windows 中,可以从正在使用该文件的进程中强制关闭该文件。 sysinternals.com 的 Process Explorer 可让您查看并关闭进程已打开的句柄。

© www.soinside.com 2019 - 2024. All rights reserved.