在Rust中如何通过Path或PathBuf编程获取文件的属性信息?
Rust 从Path/PathBuf获取文件属性与类型的实现方案
1 获取基础文件属性(标准库实现,无需额外依赖)
基础属性包括文件大小、文件类型(普通文件/目录/符号链接)、修改时间、创建时间等,直接用Rust标准库的std::fs::metadata接口即可实现:
use std::path::{Path, PathBuf}; use std::fs::Metadata; fn fetch_basic_file_attr(path: impl AsRef<Path>) -> std::io::Result<()> { // 如果要获取符号链接本身的属性,替换为std::fs::symlink_metadata let metadata = std::fs::metadata(path)?; // 文件大小,单位为字节 let file_size = metadata.len(); // 是否为普通文件 let is_regular_file = metadata.is_file(); // 是否为目录 let is_dir = metadata.is_dir(); // 是否为符号链接 let is_symlink = metadata.is_symlink(); // 修改时间(返回系统时间类型,可自行转时间戳) let modify_time = metadata.modified()?; // 访问时间 let access_time = metadata.accessed()?; // 创建时间(部分操作系统不支持,会返回Err) let create_time = metadata.created()?; Ok(()) }
2 判断文件所属分类(图片/视频/文本/音频等)
标准库没有提供文件格式识别能力,通常通过魔数识别(读取文件头部特征字节,不依赖文件后缀,准确率更高)实现,常用第三方库完成:
2.1 依赖引入
在Cargo.toml中添加依赖:
[dependencies] infer = "0.15"
2.2 识别代码示例
use std::path::Path; use std::io::Read; fn judge_file_category(path: impl AsRef<Path>) -> std::io::Result<Option<&'static str>> { // 仅读取文件前1024字节即可覆盖绝大多数格式的魔数识别,性能开销极低 let mut file = std::fs::File::open(path)?; let mut header_buf = [0; 1024]; file.read(&mut header_buf)?; match infer::get(&header_buf) { Some(file_kind) => { // 可直接调用内置方法判断分类 if file_kind.is_image() { Ok(Some("image")) } else if file_kind.is_video() { Ok(Some("video")) } else if file_kind.is_audio() { Ok(Some("audio")) } else if file_kind.is_text() { Ok(Some("text")) } else if file_kind.is_archive() { Ok(Some("archive")) } else if file_kind.is_application() { Ok(Some("application")) } else { // 也可通过file_kind.mime_type()获取完整MIME类型返回 Ok(Some(file_kind.mime_type())) } } // 无法识别的格式返回None None => Ok(None) } }
注意事项
- 若路径指向的文件不存在、无访问权限,接口都会返回Err,建议做好错误处理
- 若场景不允许读取文件内容,可改用基于后缀名识别的库,仅通过文件后缀判断分类
内容的提问来源于stack exchange,提问作者0xba1
相关产品推荐
相关产品推荐

