在Python中检测文件删除后的损坏流

4 投票
4 回答
863 浏览
提问于 2025-04-16 17:23

我的问题是,当一个Python程序的日志文件被轮换(也就是换成新的日志文件)时,日志记录就停止了。我发现问题出在流(stream)本身。我没有找到任何方法可以判断这个流在Python中是否已经坏掉。即使文件被删除了,它仍然可以正常写入。

import os

FILE = 'testing.txt'

fs = open(FILE, 'a')
fs.write('word')
os.remove(FILE)
fs.write('Nothing....') # Nothing breaks
print(fs.errors) # No errors

那么,我该如何判断这个文件流是否仍然有效呢?检查文件是否存在也没有用,因为无论流是否有效,文件总是会存在。

4 个回答

0

如果你需要比简单的 try: except: 更聪明的功能,可以使用 Python 的 ionotify 绑定。不过我觉得这只适用于 Linux 系统(我不太确定你使用的是什么平台)。

0

试试这个异常处理的教程:

import os

FILE = 'testing.txt'

try:
    fs = open(FILE, 'a')
    fs.write('word')
    os.remove(FILE)
    fs.write('Nothing....') # Nothing breaks
except Exception, e:
    print "Error:", e
print(fs.errors) # No errors
2

经过仔细检查,我找到了问题的解决办法。这是一个与操作系统有关的问题。在Linux(或Macintosh)中,当文件被删除时,它只是取消了链接。(我之前对此并不清楚)

[user@machine]$ lsof | grep --color -i "testing.txt"
python26  26495    user    8w      REG               8,33     23474     671920 /home/user/temp/testing.txt (deleted)

解决办法是在Python中检查这个流。

stat = os.fstat(fs.fileno())

这样你就能知道它有多少个链接。

if stat.st_nlink < 1:
    #has been deleted

这样一来,你就知道是否需要重新加载它了。希望这能帮助到其他人。

撰写回答