Python文件锁模块删除文件

4

我已经下载了 filelock 模块,以便在我的 Python 程序中锁定文件。 这是我的代码:

import filelock
lock = filelock.FileLock(path)
lock.acquire()
#do something...
lock.release()

由于某些我不理解的原因,当我释放锁时,文件被删除了。有人知道如何处理吗?在释放锁之后,如何保持文件可用?如果相关的话,我的文件保存在一个单独的硬盘上。谢谢。
我正在使用Windows 10 Pro。

你在用哪个操作系统进行这个操作? - siphr
@PawełKordowski 上下文管理器? - Isdj
请查看以下链接以获取有关此编程问题的答案:https://dev59.com/3nRB5IYBdhLWcg3w26x3#498505 - Paweł Kordowski
注:传递给文件锁的“路径”并不是实际要控制访问权限的文件。它是一个任意路径,象征着需要锁定的某些资源。在许多情况下,如果该资源是文件或目录,则锁定路径具有相同的名称,但带有“.lock”扩展名,但这只是一种约定。在其他情况下,锁定位于/var/lock/SOMEWHERE下。请记住,这是“咨询性锁定”:访问您要保护的文件的所有代码都必须使用相同的锁定文件路径。锁定文件路径甚至可以表示不想同时发生的任意事情。 - Scott Smith
2个回答

3
我不确定为什么,但文档建议它不会出现你所经历的情况。然而,如果您在Windows上使用它,请查看释放锁定的实现,您将意识到,如果它是最终锁定或锁定被强制释放,则确实会删除该文件。请查看 "Windows锁定机制" 部分。
Windows锁定的基本实现使用以下释放代码:
def _release(self):
    msvcrt.locking(self._lock_file_fd, msvcrt.LK_UNLCK, 1)
    os.close(self._lock_file_fd)
    self._lock_file_fd = None

    try:
        os.remove(self._lock_file)
    # Probably another instance of the application
    # that acquired the file lock.
    except OSError:
        pass
    return None

从代码可以看出os.remove将删除文件。尽管这并没有帮助,但希望能解释为什么会发生这种情况。可能是一个错误或者是某人忘记删除的过期代码。


你知道有什么方法可以覆盖这个吗?我不能把这些文件放在临时文件夹中,因为它们很大。 - Isdj
现在,为什么会这样呢?看起来很奇怪...我在我的 Mac 上测试了一下,一切正常。文件还在那里。 - idjaw
2
@IsaacDj 我建议最好的方式是进一步与模块开发人员讨论。可能会发现这是一个缺陷,可能被忽视了,或者你至少可以得到一个合理的解释,为什么它是这样的,以及你如何绕过它。 - siphr
@siphr 锁定的原因是什么,导致文件内容也被删除了? - Isdj
如果您的意思是当锁被创建或获取时,它会清空文件的内容,那是因为该模块使用截断标志创建锁文件。这意味着,如果文件已经存在,它将始终被截断(清空)。 - siphr

1

这对我在Windows上有效,也应该对你有效 benediktschmitt

你好,这个库的用例是为了通知应用程序的不同实例,共享资源当前正在被访问。例如:一些同步程序在同步期间在根文件夹中创建锁定文件,以防止其他实例同时进行操作。一旦锁定文件被删除,另一个实例就会开始同步进程。如果您想避免竞争条件,可以像这样使用此库:
```lock = FileLock(flnm + ".lock") with lock.acquire(timeout=5): with open(flnm, "a") as file: file.write("some text")```
或者您可以查看底层操作系统函数: https://www.safaribooksonline.com/library/view/python-cookbook/0596001673/ch04s25.html 编辑:删除文件是清理的一部分,是有意为之的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接