繁体   English   中英

读取 windows 文件而不阻止另一个进程写入它

[英]Reading a windows file without preventing another process from writing to it

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

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

我正在从 python 脚本读取文件,该脚本通过 our.network 远程访问文件。

我感兴趣的是有没有解决方案,不管是python支持还是delphi支持。我想知道在windows下有没有不修改写程序就可以实现的方法。

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

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

一篇关于机会锁的 MSDN 文章 Raymond Chen 也有一篇关于此的博客文章,并附有示例代码: Using opportunistic locks to get out of the way if somebody wants the file

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

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

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

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

与注释中提到的卷影复制服务相比,此方法轻便得多且效率更高,但是它需要使用筛选器驱动程序。 市场上有几种驱动程序(即那些包含驱动程序并允许您在用户模式下编写业务逻辑的产品),但它们成本高昂,在您的情况下可能会过大。 不过,如果您仅需要私人使用的东西,请私下联系我以获取我们的CallbackFilter的许可。

更新:如果要让编写者打开已打开的文件,则唯一的选择是一个过滤器,该过滤器将在打开文件时修改标志。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM