3 个版本
0.1.2 | 2024 年 5 月 15 日 |
---|---|
0.1.1 | 2024 年 5 月 15 日 |
0.1.0 | 2024 年 5 月 15 日 |
#558 in 文件系统
14KB
238 行
refind
即使在文件被重命名或移动后也能保持跟踪文件。
简介
refind
是一个跨平台的 Rust
crate,用于通过文件的 ID
定位文件。
即使在文件被重命名或移动后也能保持跟踪文件。
支持的平台
Windows
和 macOS
,在 Linux
上功能有限。
安装
cargo add refind
用法
创建文件 ID
fn main() {
let id = refind::get_id("<path>".into()).unwrap();
println!("ID: {}", id);
}
从 ID 查找路径
fn main() {
let realpath = refind::find_path("<id">).unwrap();
println!("Path: {}", realpath.display());
}
示例
查看 示例
ID 格式
在 Windows
上,ID 由一个无符号 64 位整数的字符串表示形式组成,例如 111111111111111
。
在 macOS
上,它是设备 ID 与 inode 结合使用 :
分隔符,例如 111111111:2222222222
。
工作原理
macOS
macOS
有一个特殊的目录,.vol
,允许通过设备号和文件 inode 访问文件。它还从描述符中检索文件路径。
refind
库使用 stat
创建文件 ID,包含设备 ID 和 inode,通过 .vol 促进路径检索。最后,它使用 fcntl
和 F_GETPATH
来获取真实路径。更多内容请见 此处。
为了演示,可以使用 stat <path>
,复制设备 ID 和 inode,然后使用
GetFileInfo /.vol/{device id}/{file inode}
Windows
Windows
为文件定义了唯一的标识符,并通过 GetFileInformationByHandle
提供了一种获取它的方法。
后来,refind
使用 OpenFileById
通过 ID 打开文件,并使用 GetFileInformationByHandleEx
与 FILE_INFO_BY_HANDLE_CLASS
获取其路径。
为了演示,你可以使用以下方式获取文件 ID
fsutil file queryFileid <path>
要从 ID 获取路径,可以使用
fsutil file queryFileNamebyid <volume> fileID
Linux
Linux
采用了一种简单的遍历文件系统的方法,从主目录向下遍历,比较文件ID。虽然相对较快,但效率不如macOS和Windows的方法。参见stackoverflow.com/questions/1406679/
依赖关系
~0.2–36MB
~533K SLoC