2009-02-26 91 views
8

我想打开一个由另一个应用程序定期写入的文件。此应用程序无法修改。因此,我只想在我知道它没有被其他应用程序写入时才打开该文件。Python - 如何检查一个文件是否被另一个应用程序使用?

有没有pythonic的方式来做到这一点?否则,我如何在Unix和Windows中实现这一目标?

编辑:我会尝试澄清。 有没有办法检查当前文件是否已被其他应用程序打开?

我想从这个问题开始。目前,这些其他应用程序的读/写是否无关紧要。

我意识到这可能是操作系统的依赖,所以这可能不是真正的python相关现在。

+0

你试图实现日志旋转? – vladr 2009-02-26 07:57:29

+0

不完全,但不是太远。我想在现有的应用程序之上构建一个应用程序。 – 2009-02-26 08:41:38

回答

7

您的python脚本是否希望打开文件以供书写或阅读?遗留应用程序是在写入之间打开还是关闭文件,还是保持打开状态?

我们理解遗留应用程序正在做什么以及您的python脚本试图实现什么是非常重要的。

这个功能区域与操作系统高度相关,而且您无法控制遗留应用程序的事实只会让事情变得更加困难。无论是pythonic还是非pythonic这样做的方式可能是你最担心的问题 - 难的问题将是你想要达到什么将是可能的。


UPDATE

好了,知道(从您的评论)说:

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

然后问题的参数被改变。实际上,可以在一些假设条件下以独立于操作系统的方式完成,或者作为操作系统相关和操作系统无关的技术的组合。 :)

  1. OS无关的方式:如果它是安全的假设,遗留应用程序保持文件打开的最多的时候一些已知量,说T秒(如打开文件,执行一个写,然后关闭该文件),并且每隔X秒或多或少地重新打开它,其中X大于2 * T
    • stat文件
    • 减去从now()文件的修改时间,产生D
    • 如果T < = D < X然后打开该文件,你需要用它
    • 什么这可能是足够安全为您的应用程序。随着T/X的减少,安全性增加。在* nix上,您可能需要仔细检查/etc/ntpd.conf,以确定正确的时间步长和摆动配置(请参阅修补程序)。对于Windows看到MSDN
  2. 的Windows:除了(或-代替)以上的操作系统无关的方法,你可以尝试使用两种:
    • 共享(锁定):这个假设传统程序也以共享模式打开文件(通常是Windows应用程序中的默认文件);此外,如果您的应用程序像传统应用程序尝试相同(争用条件)一样获取锁定,则传统应用程序将失败。
      • 这是非常侵入性和容易出错的。除非新应用程序和旧应用程序都需要同步访问才能写入同一文件,并且您愿意处理遗留应用程序被拒绝打开文件的可能性,否则请勿使用此方法。
    • 试图找出哪些文件是在传统的应用程序中打开,使用相同的技术ProcessExplorer(相当于* nix中的lsof
      • 你更容易受到比赛比OS-条件独立技术
  3. 的Linux /等。:除了(或同代替)上述操作系统无关的方法,则可能尝试使用相同的技术lsof或,在某些系统中,只需查看哪个文件符号链接/proc/<pid>/fd/<fdes>指向
    • 你比独立于操作系统的技术更容易受到竞争条件的影响
    • 传统应用程序使用锁定的可能性很小,但如果是这样,锁定不是真正的选择,除非传统应用程序可以优雅地处理锁定的文件(通过阻止,而不是失败 - 并且如果您自己的应用程序可以保证文件不会保持锁定状态,请阻止旧版应用程序进行扩展。)

更新2

如果有利于“检查遗留应用程序是否打开了该文件”(侵入性的方式容易出现竞争情况),则可以解决上述比赛通过以下条件:

  1. 检查遗留应用程序是否打开文件(a la lsofProcessExplorer
  2. 暂停遗留应用程序
  3. 重复步骤1中的检查以确认遗留应用程序未在步骤1和步骤2之间打开文件;如果是,请延迟并重新启动,否则请继续执行步骤4
  4. 在文件上完成您的业务 - 理想情况下只需将其重命名以用于后续独立处理,以便将遗留应用程序暂时保留最短时间
  5. 恢复遗留应用程序
+0

传统应用程序每隔X分钟打开和关闭文件,但我不想假设在t = t_0 + n * X + eps它已关闭文件。 – 2009-02-26 08:46:42

0

Unix作为默认设置没有文件锁定。我对Unix环境的最好建议是查看lsof命令的来源。它对哪些进程有哪些文件打开有深刻的了解。你可以用它作为解决方案的基础。这里是Ubuntu sources for lsof.

+0

这看起来可能是Unix上的一个很好的解决方案。我可以在访问它之前解析我需要的文件的输出。没有锁就不是完全安全,但只有在99.99%的情况下我才能处理正确性。 我只需要Windows的解决方案。 – 2009-02-26 08:50:00

0

我已经做的一件事是有python非常暂时重命名该文件。如果我们能够重命名它,那么没有其他进程正在使用它。我只在Windows上测试过。

相关问题