#file #cross-platform #system #sync #search

refind

跨平台文件定位器,通过文件 ID 跟踪文件,即使在文件被重命名或移动后也能保持跟踪。

3 个版本

0.1.2 2024 年 5 月 15 日
0.1.1 2024 年 5 月 15 日
0.1.0 2024 年 5 月 15 日

#558 in 文件系统

MIT 许可证

14KB
238

refind

Crates License

即使在文件被重命名或移动后也能保持跟踪文件。

简介

refind 是一个跨平台的 Rust crate,用于通过文件的 ID 定位文件。

即使在文件被重命名或移动后也能保持跟踪文件。

支持的平台

WindowsmacOS,在 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 促进路径检索。最后,它使用 fcntlF_GETPATH 来获取真实路径。更多内容请见 此处

为了演示,可以使用 stat <path>,复制设备 ID 和 inode,然后使用

GetFileInfo /.vol/{device id}/{file inode}

Windows

Windows 为文件定义了唯一的标识符,并通过 GetFileInformationByHandle 提供了一种获取它的方法。

后来,refind 使用 OpenFileById 通过 ID 打开文件,并使用 GetFileInformationByHandleExFILE_INFO_BY_HANDLE_CLASS 获取其路径。

为了演示,你可以使用以下方式获取文件 ID

fsutil file queryFileid <path>

要从 ID 获取路径,可以使用

fsutil file queryFileNamebyid <volume> fileID

查看 microsoft/extendedfileapis

Linux

Linux采用了一种简单的遍历文件系统的方法,从主目录向下遍历,比较文件ID。虽然相对较快,但效率不如macOS和Windows的方法。参见stackoverflow.com/questions/1406679/

依赖关系

~0.2–36MB
~533K SLoC