当前位置: 首页 > 面试题库 >

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

杜思远
2023-03-14
问题内容

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

有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 :除了上述(或位于环境中)与操作系统无关的方法外,您可以尝试使用以下任一方法:
    • 共享(锁定):假设旧版程序也以共享模式(通常是Windows应用程序的默认模式)打开文件;此外,如果您的应用程序在传统应用程序尝试进​​行相同操作(争用条件)时获得了锁,则传统应用程序将失败。
    • 这是极具侵入性且容易出错的。除非新应用程序和旧应用程序都需要同步访问权限才能写入同一文件,并且您愿意处理旧应用程序被拒绝打开文件的可能性,否则请不要使用此方法。
    • 尝试使用与ProcessExplorer相同的技术(相当于* nix的技术lsof) 来找出旧应用程序中打开的文件
    • 与独立于操作系统的技术相比,您甚至更容易受到比赛条件的影响
  3. Linux /等 :除了上述与操作系统无关的方法外(或在方法中),您可以尝试使用与以下方法相同的技术,lsof或者在某些系统上,只需检查符号链接/proc/<pid>/fd/<fdes>指向 哪个文件
    • 与独立于操作系统的技术相比,您甚至更容易受到比赛条件的影响
    • 遗留应用程序极不可能使用锁定,但是,如果不是,则锁定不是真正的选择,除非遗留应用程序可以优雅地处理锁定的文件(通过阻止而不是失败-并且您自己的应用程序可以保证该文件将不会保持锁定状态,从而延长了对旧版应用程序的锁定时间。)

更新2

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

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


 类似资料:
  • 问题内容: 我需要测试从1到1000的每个数字是3的倍数还是5的倍数。我认为我要这样做的方式是将数字除以3,如果结果是整数,则它将是3的倍数。与5相同。 如何测试数字是否为整数? 这是我当前的代码: 问题答案: 您可以使用模运算符执行此操作, 当且仅当是的精确倍数时,计算结果为true 。在小学数学中,这被称为除法运算的余数。 在您当前的方法中,您执行除法,结果将是 如果使用整数除法,则始终为整数

  • 如果这在Flutter中很难实现,有没有人可以为这个功能建议一些其他的语言或代码? 谢谢!!

  • 当我启动音频/屏幕录像机并打开我的录音机应用程序并启动用于录制音频的服务时,我遇到错误该应用程序崩溃。 我不知道为什么我会面临这个问题。 来自logcat的错误跟踪 录制服务.java 录音活动 这就是我尝试在应用程序中开始录制时发生的情况 链接如下。 显示我的应用程序崩溃

  • rank ▲ ✰ vote url 4 1266 285 929 url 用Python如何一个文件是否存在? 不用try:语句可以一个文件存在 如果不确定文件存不存在,可以这样做: import os.path os.path.isfile(fname)

  • 问题内容: 我到处都在寻找这个答案,但是找不到。 我正在尝试提出一个脚本,该脚本将搜索特定的子文件夹,然后检查其是否包含任何文件,如果有,则写出文件夹的路径。我已经弄清楚了子文件夹搜索部分,但是对文件的检查让我很困惑。 我发现了关于如何检查文件夹是否为空的多种建议,并且尝试修改脚本以检查文件夹是否为空,但是我没有得到正确的结果。 这是最接近的脚本: 这将列出所有空的子文件夹,但是如果我尝试将其更改

  • 嗯,我做了这个脚本,它支持日志一些击键一段时间保存在一个文件中,然后擦除文件,如果用户想要然而当脚本tryes删除文件我得到这个错误。 Traceback(最近一次调用最后一次):文件"C:\用户\Tormenter\Desktop\S. D. A. K. L\pregunta.py",第34行,os.remove(path 2"\"name)PermissionError:[WinError 3