You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:57:02