我正在编写一个脚本,它将轮询目录以查找新文件.
在这种情况下,是否有必要进行某种错误检查以确保文件在访问之前完全写入?
在将文件完全写入磁盘之前我不想使用文件,但因为我想从文件中获取的信息接近开头,所以似乎可以在不实现文件的情况下提取我需要的数据没有写完.
这是我应该担心的事情,还是文件被锁定,因为操作系统正在写入硬盘?
这是在Linux系统上.
通常在Linux上,除非您使用某种类型的锁定,否则两个进程可以很高兴地同时打开同一个文件,即使是写入也是如此.有三种方法可以避免此问题:
锁定
通过使写入器对文件应用锁定,可以防止读取器部分地读取文件.但是,大多数锁都是建议性的,所以无论如何仍然完全可以看到部分结果.(强制锁存在,但强烈建议不要因为它们太脆弱了.)编写正确的锁定代码相对困难,将这些任务委托给专业库(即数据库引擎)是正常的. !)特别是,您不希望在网络文件系统上使用锁定; 当它工作时,它是一个巨大的麻烦的来源,往往是彻底错误.
惯例
可以使用另一个名称在同一目录中创建一个文件,这个名称在读取方面不会自动查找(例如.foobar.txt.tmp
),然后foobar.txt
在写入完成后以原子方式重命名为正确的名称(例如).这可以很好地工作,只要你注意处理以前运行无法正确写入文件的可能性.如果一次只有一个作者,这实现起来相当简单.
不用担心
经常编写的最常见文件类型是日志文件.这些可以很容易地编写,信息严格地只附加到文件中,因此任何读者都可以安全地查看文件的开头,而不必担心任何变化.这在实践中非常有效.
任何这方面的Python都没有什么特别之处.在Linux上运行的所有程序都有相同的问题.
在 Unix 上,除非写入应用程序出现问题,否则文件不会被锁定,您将能够从中读取内容。
当然,读者必须准备好处理不完整的文件(请记住,作者一方可能会发生 I/O 缓冲)。
如果这是行不通的,您将不得不考虑一些方案来同步写入器和读取器,例如: