分拣目录:如何不拾取仍在写入的文件?

时间:2011-09-29 01:51:51

标签: python file-io batch-processing

我有一个Python脚本,它检查拾取目录并处理它找到的任何文件,然后删除它们。

如何确保不会删除仍在删除该目录中文件的进程写入的文件?

我的测试用例非常简单。我将300MB的文件复制粘贴到拾取目录中,并且脚本经常会抓取仍在写入的文件。它仅对部分文件进行操作,然后将其删除。当它写入的文件消失时,这会触发操作系统中的文件操作错误。

  • 在打开/处理/删除文件之前,我尝试获取文件锁(使用FileLock模块)。但这没有帮助。

  • 我考虑过检查文件的修改时间,以避免现在X秒内的任何事情。但这似乎很笨拙。

我的测试是在OSX上进行的,但我正在尝试找到一种适用于主要平台的解决方案。

我在这里看到了类似的问题(How to check if a file is still being written?),但没有明确的解决方案。

谢谢

5 个答案:

答案 0 :(得分:2)

作为一种解决方法,您可以收听文件修改事件(watchdog是跨平台的)。每次写入都不会触发修改后的事件(至少在OS X上),它只在关闭时触发。因此,当您检测到已修改的事件时,您可以假设所有写入都已完成。

当然,如果文件是以块的形式写入的,并且在每个块之后保存,则无法正常工作。

答案 1 :(得分:1)

此问题的一个解决方案是更改编写文件的程序,首先将文件写入临时文件,然后在完成后将该临时文件移动到目标。在大多数操作系统上,当源和目标位于同一文件系统上时,move是原子的。

答案 2 :(得分:1)

如果您无法控制书写部分,您可以做的就是自己观看文件,当它停止生长一段时间时,请将其称为好。我必须自己使用那种方法,发现40秒对我的病情是安全的。

答案 3 :(得分:1)

每个操作系统都有不同的解决方案,因为文件锁定机制不可移植。

  • 在Windows上,您可以使用操作系统锁定。
  • 在Linux上,您可以查看打开的文件(类似于lsof的用法),如果文件已打开,请将其保留。

答案 4 :(得分:0)

您是否尝试在复制之前打开文件?如果文件仍在使用中,则open()应该抛出异常。

try:
  with open(filename, "rb") as fp:
    pass
  # Copy the file
except IOError:
  # Dont copy