如何在文件写入时避免选取未完成的文件?

6 投票
5 回答
1415 浏览
提问于 2025-04-17 03:19

我有一个Python脚本,它会检查一个文件夹,处理里面的文件,然后把这些文件删除。

我想确保不会去处理那些仍在写入中的文件,也就是那些还没有完全保存好的文件。

我的测试案例很简单。我把300MB的文件复制粘贴到这个文件夹里,结果脚本经常会抓到一个还在写入的文件。它只处理了这个文件的一部分,然后就把它删除了。这样会导致操作系统出现文件操作错误,因为它正在写的文件突然消失了。

  • 我尝试在打开、处理或删除文件之前先对文件进行锁定(使用FileLock模块),但这并没有解决问题。

  • 我考虑过检查文件的修改时间,避免处理在当前时间X秒内修改过的文件。但这样的方法感觉不太方便。

我的测试是在OSX上进行的,但我希望找到一个可以在主要平台上都能用的解决方案。

我看到这里有一个类似的问题(如何检查一个文件是否仍在写入中?),但没有明确的解决办法。

谢谢

5 个回答

1

解决这个问题的一种方法是,先让写文件的程序把文件写到一个临时文件里,然后等写完了再把这个临时文件移动到目标位置。在大多数操作系统中,如果源文件和目标文件在同一个文件系统里,移动文件的操作是原子的,也就是说这个过程要么完全成功,要么完全不做,不会出现半途而废的情况。

1

每个操作系统都有不同的解决办法,因为文件锁定的机制在不同系统之间是不能通用的。

  • 在Windows系统上,你可以使用操作系统自带的锁定功能。
  • 在Linux系统上,你可以查看哪些文件是打开的(就像lsof工具那样),如果发现某个文件正在被使用,就不要去操作它。
2

作为一种解决方法,你可以监听文件修改事件(可以使用watchdog这个工具,它支持多个操作系统)。在OS X系统上,文件修改事件并不是每次写入时都会触发,而是只有在文件关闭时才会触发。所以当你检测到文件被修改的事件时,就可以认为所有的写入操作都已经完成了。

当然,如果文件是分块写入的,并且每写完一块就保存一次,这种方法就不适用了。

撰写回答