在Python中检测并删除锁定文件

4 投票
3 回答
7499 浏览
提问于 2025-04-15 13:49

我想用Python在Unix系统上检查一个文件是否被锁定。如果删除这个文件能帮助我判断它是否被锁定,那也没问题。

这个文件可能是被其他程序独占打开的。文档上似乎说,使用os.unlink删除文件时,如果文件被锁定,可能不会返回错误。

有没有什么好的想法?

3 个回答

-1

我在Mac上尝试锁定一个文件,然后在另一个终端删除这个文件。结果发现文件还是可以被删除。

lock_file_path = "/tmp/lock.file"
fd = open(lock_file_path,"w")
fcntl.flock(fd.fileno(),LOCK_EX)
while True:
    print("Locked")
7

来自fcntl文档的内容:

fcntl.lockf(fd, operation[, length[, start[, whence]]])

如果使用了LOCK_NB选项,但无法获取锁,就会出现一个IOError错误,这个错误会有一个errno属性,值可能是EACCES或EAGAIN(具体取决于操作系统;为了兼容性,最好检查这两个值)。

这个方法使用了底层的unix flock机制,所以看起来应该能满足你的需求。另外,还有一个os.open方法,可能在不同平台上更具通用性。

8

检查一个文件是否被锁定的最好方法就是尝试去锁定它。在Python中,可以使用fcntl模块来实现,比如:

fcntl.lockf(fileobj.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)

如果文件已经被锁定,这段代码会抛出一个IOError错误;如果没有错误发生,那就说明文件可以锁定。接下来,你可以使用:

fcntl.lockf(fileobj.fileno(), fcntl.LOCK_UN)

来解锁文件。

需要注意的是,与Windows不同,在Unix系统中,打开一个文件进行写入并不会自动给你一个独占锁。另外,fcntl模块在Windows上是不可用的;你需要使用os.open,这个接口相对不太友好,但更具可移植性(可能还需要重新打开文件)。

撰写回答