簡體   English   中英

檢查在python中打開后是否刪除了打開的文件

[英]Check if an open file has been deleted after open in python

是否可以檢查文件是否已在python中刪除或重新創建?

例如,如果您在腳本中執行了open("file") ,然后在該文件仍處於打開狀態時,則執行rm file; touch 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

(如果你想讓它100%正確,那么你應該只比較stat結果中的st_devst_ino字段,因為其他字段和st_atime特別是在調用之間可能會發生變化。)

是。 使用os.stat()函數檢查文件長度。 如果長度為零(或函數返回錯誤“File not found”),則有人刪除了該文件。

或者,您可以在每次需要寫入文件時打開+ write + close文件。 缺點是打開文件是一個非常慢的操作,所以如果你需要編寫大量數據,這是不可能的。

為什么? 因為新文件不是您打開的文件。 簡而言之,Unix文件系統有兩個級別。 一個是目錄條目(即文件名,文件大小,修改時間,指向數據的指針),第二級是文件數據。

當您打開文件時,Unix使用該名稱來查找文件數據。 之后,它僅在第二級運行 - 對目錄條目的更改對任何打開的“文件句柄”都沒有影響。 這正是您刪除目錄條目的原因:您的程序未使用它。

使用os.stat() ,不會再查看文件數據,而是查看目錄條目。

從積極的方面來說,這允許您創建除了您的程序之外無人能看到的文件:打開文件,刪除它然后再使用它。 由於該文件沒有目錄條目,因此沒有其他程序可以訪問該數據。

從消極方面來說,你不能輕易解決你所擁有的問題。

是 - 您可以使用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,但是從你的問題我假設你正在使用它(引用rmtouch )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM