python - 读取 Windows 文件而不阻止其他进程写入该文件

标签 python windows delphi winapi filesystems

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

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

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

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

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

最佳答案

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

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

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

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

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

关于python - 读取 Windows 文件而不阻止其他进程写入该文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14617983/

相关文章:

python - 为什么使用巴特沃斯滤波器进行低频滤波时会出现错误?

python - 如何使用 PyCall 在 Julia 中使用内置的 Python read() 函数?

.net - VB 6/.NET 互操作最近是否被 Windows 更新破坏了?

wpf - 在 WinForms 或 WPF 应用程序中编辑 HTML

json - 当值为整数时,无法将小数部分显示为 .0

python - 用django自己加入postgresql

python - 可以找到重新定位的库的 virtualenv(比如 MySQLdb 的 mysqlclient 库)

windows - Taskkill/f 不会终止进程

xml - Delphi 中的 JSON 与 XML 解析速度

mysql - 检查 MySQL 中的事件事务