我有一个Python脚本,它检查拾取目录并处理它找到的任何文件,然后删除它们。
如何确保不会删除仍在删除该目录中文件的进程写入的文件?
我的测试用例非常简单。我将300MB的文件复制粘贴到拾取目录中,并且脚本经常会抓取仍在写入的文件。它仅对部分文件进行操作,然后将其删除。当它写入的文件消失时,这会触发操作系统中的文件操作错误。
在打开/处理/删除文件之前,我尝试获取文件锁(使用FileLock模块)。但这没有帮助。
我考虑过检查文件的修改时间,以避免现在X秒内的任何事情。但这似乎很笨拙。
我的测试是在OSX上进行的,但我正在尝试找到一种适用于主要平台的解决方案。
我在这里看到了类似的问题(How to check if a file is still being written?),但没有明确的解决方案。
谢谢
答案 0 :(得分:2)
作为一种解决方法,您可以收听文件修改事件(watchdog是跨平台的)。每次写入都不会触发修改后的事件(至少在OS X上),它只在关闭时触发。因此,当您检测到已修改的事件时,您可以假设所有写入都已完成。
当然,如果文件是以块的形式写入的,并且在每个块之后保存,则无法正常工作。
答案 1 :(得分:1)
此问题的一个解决方案是更改编写文件的程序,首先将文件写入临时文件,然后在完成后将该临时文件移动到目标。在大多数操作系统上,当源和目标位于同一文件系统上时,move是原子的。
答案 2 :(得分:1)
如果您无法控制书写部分,您可以做的就是自己观看文件,当它停止生长一段时间时,请将其称为好。我必须自己使用那种方法,发现40秒对我的病情是安全的。
答案 3 :(得分:1)
每个操作系统都有不同的解决方案,因为文件锁定机制不可移植。
答案 4 :(得分:0)
您是否尝试在复制之前打开文件?如果文件仍在使用中,则open()应该抛出异常。
try:
with open(filename, "rb") as fp:
pass
# Copy the file
except IOError:
# Dont copy