Is it possible to check if a file has been deleted or recreated in python?
For example, if you did a open("file") in the script, and then while that file is still open, you do rm file; touch file;, then the script will still hold a reference to the old file even though it’s already been deleted.
Yes. Use the
os.stat()function to check the file length. If the length is zero (or the function returns the error “File not found”), then someone deleted the file.Alternatively, you can open+write+close the file each time you need to write something into it. The drawback is that opening a file is a pretty slow operation, so this is out of the question if you need to write a lot of data.
Why? Because the new file isn’t the file that you’re holding open. In a nutshell, Unix filesystems have two levels. One is the directory entry (i.e. the file name, file size, modification time, pointer to the data) and the second level is the file data.
When you open a file, Unix uses the name to find the file data. After that, it operates only on the second level – changes to the directory entry have no effect on any open “file handles”. Which is exactly why you can delete the directory entry: Your program isn’t using it.
When you use
os.stat(), you don’t look at the file data but at the directory entry again.On the positive side, this allows you to create files which no one can see but your program: Open the file, delete it and then use it. Since there is no directory entry for the file, no other program can access the data.
On the negative side, you can’t easily solve problems like the one you have.