I have an open std::fs::File
, and I want to get it’s filename, e.g. as a PathBuf
. How do I do that?
The simple solution would be to just save the path used in the call to File::open
. Unfortunately, this does not work for me. I am trying to write a program that reads log files, and the program that writes the logs keep changing the filenames as part of it’s log rotation. So the file may very well have been renamed since it was opened. This is on Linux, so renaming open files is possible.
How do I get around this issue, and get the current filename of an open file?
Advertisement
Answer
On a typical Unix filesystem, a file may have multiple filenames at once, or even none at all. The file metadata is stored in an inode, which has a unique inode number, and this inode number can be linked from any number of directory entries. However, there are no reverse links from the inode back to the directory entries.
Given an open File
object in Rust, you can get the inode number using the ino()
method. If you know the directory the log file is in, you can use std::fs::read_dir()
to iterate over all entries in that directory, and each entry will also have an ino()
method, so you can find the one(s) matching your open file object. Of course this approach is subject to race conditions – the directory entry may already be gone again once you try to do anything with it.