在Python中,是否可能检查文件是否已被删除或重新创建?
例如,如果您在脚本中使用了open("file")
,然后在该文件仍处于打开状态时进行rm file; touch file;
操作,那么尽管文件已被删除,脚本仍将保留对旧文件的引用。
在Python中,是否可能检查文件是否已被删除或重新创建?
例如,如果您在脚本中使用了open("file")
,然后在该文件仍处于打开状态时进行rm file; touch file;
操作,那么尽管文件已被删除,脚本仍将保留对旧文件的引用。
fstat
操作。>>> import os
>>> f = open("testdv.py")
>>> os.fstat(f.fileno())
posix.stat_result(st_mode=33188, st_ino=1508053, st_dev=65027L, st_nlink=1, st_uid=1000, st_gid=1000, st_size=1107, st_atime=1349180541, st_mtime=1349180540, st_ctime=1349180540)
>>> os.fstat(f.fileno()).st_nlink
1
>>> os.unlink("testdv.py")
>>> os.fstat(f.fileno()).st_nlink
0
没有更多的链接,因此我们有一个“匿名文件”,只有当我们打开它时才保持存活。创建一个同名的新文件对旧文件没有影响:
>>> g = open("testdv.py", "w")
>>> os.fstat(g.fileno()).st_nlink
1
>>> os.fstat(f.fileno()).st_nlink
0
st_nlink
有时可能最初为>1
,因此检查它是否为零并不完全可靠(尽管在受控环境中,这可能已足够)。相反,您可以通过比较stat
结果来验证您最初打开的路径上的文件是否与您拥有文件描述符的文件相同:>>> os.stat("testdv.py") == os.fstat(f.fileno())
False
>>> os.stat("testdv.py") == os.fstat(g.fileno())
True
proc/<pid>/fd/...
,即使文件已被删除,也可以访问数据。如果您想复制从YouTube下载的视频,这有时会很方便;-) - hochlfd
目录内容,您需要成为该用户或root(权限为dr-x------
),因此仍然是安全的。 - Aaron Digullastat()
应该检查目录条目(即新文件),当您触碰新文件时,新文件数据应该具有长度0。 - Aaron Digulla是的 - 您可以使用inotify
设施来检查文件更改和更多信息。还有一个Python绑定可用于此。使用inotify,您可以监视文件或目录以进行文件系统活动。从手册中可以检测到以下事件:
IN_ACCESS File was accessed (read) (*).
IN_ATTRIB Metadata changed, e.g., permissions, timestamps, extended attributes, link count (since Linux 2.6.25), UID, GID, etc. (*).
IN_CLOSE_WRITE File opened for writing was closed (*).
IN_CLOSE_NOWRITE File not opened for writing was closed (*).
IN_CREATE File/directory created in watched directory (*).
IN_DELETE File/directory deleted from watched directory (*).
IN_DELETE_SELF Watched file/directory was itself deleted.
IN_MODIFY File was modified (*).
IN_MOVE_SELF Watched file/directory was itself moved.
IN_MOVED_FROM File moved out of watched directory (*).
IN_MOVED_TO File moved into watched directory (*).
IN_OPEN File was opened (*).
从这里你可以自己谷歌解决方案,但我想你已经有了总体的想法。当然,这可能只适用于Linux,但根据您的问题,我假设您正在使用它(参考rm
和touch
)。