Python-如何检查文件是否被另一个应用程序使用?

我想打开一个文件,该文件由另一个应用程序定期写入。此应用程序无法修改。因此,我只想在我知道该文件未被其他应用程序写入时才打开该文件。

python方式可以做到这一点吗?否则,如何在Unix和Windows中实现呢?

:我将尝试澄清。 有没有办法检查当前文件是否已被另一个应用程序打开?

我想从这个问题开始。这些其他应用程序现在是否读写无关紧要。

我意识到这可能与操作系统有关,所以现在可能与python无关。

回答:

您的python脚本是否希望打开文件进行写入或读取?旧应用程序是在写操作之间打开和关闭文件,还是保持打开状态?

理解遗留应用程序正在执行的操作以及您的python脚本正在尝试实现的功能非常重要。

此功能区域高度依赖于OS,并且不幸的是,您无法控制旧版应用程序这一事实使事情变得更加困难。到底有没有Python或非Python的方法可能是您最少要担心的问题-

难题是您尝试实现的目标是否可能。


好的,因此(从您的评论中)知道:

旧版应用程序每隔X分钟打开和关闭文件,但我不想假设在t = t_0 + n * X + eps时它已经关闭了文件。

然后更改问题的参数。实际上,在给出一些假设的情况下,可以通过与OS无关的方式来完成此操作,也可以结合使用OS和OS无关的技术来完成此操作。:)

  1. :如果可以安全地假定旧版应用程序使文件最多打开某个已知的时间量,例如T几秒钟(例如,打开文件,执行一次写入然后关闭文件),然后重新打开每秒钟或多或少XX大于2 * T

    • stat 文件
    • 从中减去文件的修改时间now(),产生D
    • 如果T<= D<X然后打开文件并执行所需的操作
    • 这对于您的应用程序来说可能是足够安全的 。安全随着T/X降低而增加。在* nix上,您可能必须仔细检查/etc/ntpd.conf时间步长和摆率配置的正确性(请参阅修补程序)。对于Windows,请参见MSDN。

  2. :除了上述(或位于环境中)与操作系统无关的方法外,您可以尝试使用以下任一方法:

    • 共享(锁定):假设旧版程序也以共享模式(通常是Windows应用程序的默认模式)打开文件;此外,如果您的应用程序在传统应用程序尝试进​​行相同操作(争用条件)时获得了锁,则传统应用程序将失败。
    • 这是极具侵入性且容易出错的。除非新应用程序和旧应用程序都需要同步访问权限才能写入同一文件,并且您愿意处理旧应用程序被拒绝打开文件的可能性,否则请不要使用此方法。
    • 尝试使用与ProcessExplorer相同的技术(相当于* nix的技术lsof) 来找出旧应用程序中打开的文件
    • 与独立于操作系统的技术相比,您甚至更容易受到比赛条件的影响

  3. :除了上述与操作系统无关的方法外(或在方法中),您可以尝试使用与以下方法相同的技术,lsof或者在某些系统上,只需检查符号链接/proc/<pid>/fd/<fdes>指向 哪个文件

    • 与独立于操作系统的技术相比,您甚至更容易受到比赛条件的影响
    • 遗留应用程序极不可能使用锁定,但是,如果不是,则锁定不是真正的选择,除非遗留应用程序可以优雅地处理锁定的文件(通过阻止而不是失败-并且您自己的应用程序可以保证该文件将不会保持锁定状态,从而延长了对旧版应用程序的锁定时间。)


如果赞成“检查旧版应用程序是否已打开文件”(易于出现竞争状况的侵入性方法),则可以通过以下方法解决所述竞争状况:

  1. 检查旧版应用程序是否已打开文件(lalsofProcessExplorer
  2. 暂停旧版应用程序流程
  3. 重复步骤1中的检查,以确认旧版应用程序在步骤1和2之间没有打开文件;延迟并在步骤1重新启动,否则,请继续执行步骤4
  4. 在文件上开展业务-理想的情况是简单地将其重命名以进行后续的独立处理,以使旧版应用程序保持挂起状态的时间最短
  5. 恢复旧版应用程序流程

以上是 Python-如何检查文件是否被另一个应用程序使用? 的全部内容, 来源链接: utcz.com/qa/427185.html

回到顶部