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