2

我有一个想要阅读的文件。该文件可能随时被另一个进程覆盖。我不想阻止这种写作。我准备好管理我读取的数据的损坏,但不希望我的读取以任何方式改变写入过程的行为。

正在写入文件的进程是在服务器本地运行的 delphi 程序。它使用 fmCreate 打开文件。fmCreate 尝试以独占方式打开文件,如果文件上有任何其他句柄,则会失败。

我正在从通过我们的网络远程访问文件的 python 脚本读取文件。

我对是否有解决方案感兴趣,与python或delphi是否支持无关。我想知道在windows下是否有什么方法可以在不修改编写程序的情况下实现这一点。

编辑:重申一下,这不是重复的。另一个问题是试图获得对正在写入的文件的读取权限。我希望作者能够访问我已打开以供阅读的文件。这些是不同的问题(尽管我担心答案会相似,但无法完成。)

4

2 回答 2

2

我认为,这么多年过去了,真正的答案是使用机会锁。有了这个,您可以打开文件进行读取访问,同时告诉操作系统您希望在另一个程序想要访问该文件时得到通知。基本上,您可以随心所欲地使用该文件,然后在其他人需要时退出。如果您刚刚“正常”打开文件,这可以避免其他程序通常会遇到的共享/访问冲突。

一篇关于 Opportunistic Locks 的 MSDN 文章。Raymond Chen 也有一篇关于此的博客文章,并附有示例代码:如果有人想要文件,则使用机会锁让路

关键是DeviceIoControl使用标志调用函数,FSCTL_REQUEST_OPLOCK并将句柄传递给您之前通过调用创建的事件CreateEvent

在 Delphi 中使用它应该很简单,因为它支持调用 Windows API 函数。我对 Python 不太确定。但是,鉴于问题中的安排,应该没有必要修改 Python 代码。只需让您的 Delphi 代码在打开文件时使用机会锁,并在 Python 脚本需要文件时让它让开。

也比过滤器驱动程序或卷影复制服务更容易和更轻。

于 2021-10-12T07:59:54.053 回答
0

您可以设置一个过滤器驱动程序,它可以通过两种方式起作用:(1)在打开文件时修改标志,(2)它可以在将数据写入文件时捕获数据并将数据副本保存在其他地方。

这种方法比评论中提到的卷影复制服务更轻量级和高效,但是它需要一个过滤器驱动程序。市场上有几种驱动程序(即那些包含驱动程序并让您在用户模式下编写业务逻辑的产品),但它们的成本很高,并且在您的情况下可能是过度杀伤力。不过,如果您只需要这个东西供私人使用,请私下联系我以获得我们的 CallbackFilter 的许可证。

更新:如果你想让作者打开已经打开的文件,那么在打开文件时修改标志的过滤器是你唯一的选择。

于 2013-01-31T06:37:03.243 回答