Rust文件时间操作库filetime_creation的使用:高效创建和修改文件时间戳的Rust插件库

Rust文件时间操作库filetime_creation的使用:高效创建和修改文件时间戳的Rust插件库

注意事项

Rust 1.75 版本已经稳定了 std::fs::File::set_timesFileTimesExt 特性。这意味着如果你使用 Rust 1.75 或更高版本,或者你的库的最低支持 Rust 版本(MSRV)允许使用 1.75 及以上版本,你就不再需要使用这个 crate,我们建议你直接使用标准库。

但是如果你因为某些原因无法使用 Rust 1.75 及以上版本,那么你仍然需要使用这个 crate 作为替代方案。

简介

这是 filetime 的增强版本,可以在 Windows 上设置文件创建时间。

在内部,这个库使用 Windows 的 SetFileTime Win32 API 来设置文件创建时间。

在其他平台上,所有函数只会调用对应的 filetime 库的函数,并忽略文件创建时间。

安装

在 Cargo.toml 中添加依赖:

[dependencies]
filetime_creation = "0.1"

完整示例代码

use filetime_creation::{FileTime, set_file_creation_time};
use std::fs::File;
use std::path::Path;

fn main() -> std::io::Result<()> {
    // 创建一个测试文件
    let path = Path::new("test.txt");
    File::create(&path)?;
    
    // 指定要设置的时间 - 这里设置为当前时间
    let creation_time = FileTime::now();
    
    // 设置文件创建时间
    set_file_creation_time(&path, creation_time)?;
    
    println!("成功设置了文件创建时间");
    Ok(())
}

扩展示例代码

以下是一个更完整的示例,展示如何同时设置文件的创建、修改和访问时间:

use filetime_creation::{FileTime, set_file_creation_time, set_file_mtime, set_file_atime};
use std::fs::File;
use std::path::Path;
use std::time::{SystemTime, UNIX_EPOCH};

fn main() -> std::io::Result<()> {
    // 创建测试文件
    let path = Path::new("example.txt");
    File::create(&path)?;
    
    // 获取当前系统时间
    let now = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_secs();
    
    // 创建FileTime对象 - 设置为2023年1月1日
    let custom_time = FileTime::from_unix_time(1672531200 as i64, 0);
    
    // 设置文件创建时间
    set_file_creation_time(&path, custom_time)?;
    
    // 设置文件修改时间
    set_file_mtime(&path, custom_time)?;
    
    // 设置文件访问时间(设置为当前时间)
    let now_time = FileTime::now();
    set_file_atime(&path, now_time)?;
    
    println!("成功设置了文件时间属性");
    Ok(())
}

许可证

本项目采用以下任一许可证:

  • Apache License, Version 2.0
  • MIT license

贡献

除非你明确声明,否则任何有意提交包含在 filetime_creation 中的贡献,根据 Apache-2.0 许可证的定义,都将按照上述方式双重许可,不附加任何额外条款或条件。


1 回复

Rust文件时间操作库filetime_creation使用指南

filetime_creation是一个专门用于高效创建和修改文件时间戳的Rust库,它提供了简单易用的API来操作文件的访问时间(atime)和修改时间(mtime)。

安装

Cargo.toml中添加依赖:

[dependencies]
filetime_creation = "0.2"

基本用法

设置文件时间戳

use filetime_creation::{FileTime, set_file_times};
use std::fs::File;

fn main() -> std::io::Result<()> {
    let file = File::create("example.txt")?;
    
    // 设置访问时间和修改时间为当前时间
    let now = FileTime::now();
    set_file_times("example.txt", now, now)?;
    
    // 设置特定时间
    let custom_time = FileTime::from_unix_time(1_000_000_000, 0); // 2001-09-09 01:46:40
    set_file_times("example.txt", custom_time, custom_time)?;
    
    Ok(())
}

获取文件时间戳

use filetime_creation::metadata;

fn main() -> std::io::Result<()> {
    let meta = metadata("example.txt")?;
    
    println!("访问时间: {:?}", meta.accessed());
    println!("修改时间: {:?}", meta.modified());
    println!("创建时间: {:?}", meta.created());
    
    Ok(())
}

高级功能

批量修改文件时间

use filetime_creation::{FileTime, set_file_times};
use std::fs;
use std::path::Path;

fn update_dir_times(dir: &Path) -> std::io::Result<()> {
    let new_time = FileTime::now();
    
    for entry in fs::read_dir(dir)? {
        let entry = entry?;
        let path = entry.path();
        
        if path.is_dir() {
            update_dir_times(&path)?;
        }
        
        set_file_times(&path, new_time, new_time)?;
    }
    
    Ok(())
}

跨平台兼容性处理

use filetime_creation::{FileTime, set_file_times};
use std::fs::File;

fn set_file_time_safe(path: &str) -> std::io::Result<()> {
    // 确保文件存在
    let _ = File::open(path)?;
    
    // 设置时间戳
    let time = FileTime::from_unix_time(1_000_000_000, 0);
    set_file_times(path, time, time)
        .map_err(|e| {
            eprintln!("设置时间戳失败: {}", e);
            e
        })
}

完整示例代码

下面是一个综合使用filetime_creation库的完整示例:

use filetime_creation::{FileTime, set_file_times, metadata};
use std::fs::{self, File};
use std::path::Path;
use std::time::SystemTime;

fn main() -> std::io::Result<()> {
    // 1. 创建示例文件
    let file_path = "demo_file.txt";
    File::create(file_path)?;
    
    // 2. 设置文件时间戳为当前时间
    let now = FileTime::now();
    set_file_times(file_path, now, now)?;
    
    // 3. 获取并打印文件时间戳
    let meta = metadata(file_path)?;
    println!("初始时间戳:");
    println!("访问时间: {:?}", meta.accessed());
    println!("修改时间: {:?}", meta.modified());
    println!("创建时间: {:?}", meta.created());
    
    // 4. 设置特定时间戳(2001-09-09 01:46:40)
    let custom_time = FileTime::from_unix_time(1_000_000_000, 0);
    set_file_times(file_path, custom_time, custom_time)?;
    
    // 5. 再次获取并打印时间戳
    let updated_meta = metadata(file_path)?;
    println!("\n修改后的时间戳:");
    println!("访问时间: {:?}", updated_meta.accessed());
    println!("修改时间: {:?}", updated_meta.modified());
    
    // 6. 批量修改目录下所有文件时间戳
    let dir_path = "demo_dir";
    fs::create_dir_all(dir_path)?;
    File::create(Path::new(dir_path).join("file1.txt"))?;
    File::create(Path::new(dir_path).join("file2.txt"))?;
    
    println!("\n批量修改目录时间戳...");
    update_dir_times(Path::new(dir_path))?;
    
    // 7. 安全设置时间戳示例
    println!("\n安全设置时间戳示例:");
    set_file_time_safe(file_path)?;
    
    Ok(())
}

// 递归修改目录中所有文件的时间戳
fn update_dir_times(dir: &Path) -> std::io::Result<()> {
    let new_time = FileTime::now();
    
    for entry in fs::read_dir(dir)? {
        let entry = entry?;
        let path = entry.path();
        
        if path.is_dir() {
            update_dir_times(&path)?;
        }
        
        set_file_times(&path, new_time, new_time)?;
        println!("已更新: {:?}", path);
    }
    
    Ok(())
}

// 安全设置时间戳函数
fn set_file_time_safe(path: &str) -> std::io::Result<()> {
    // 确保文件存在
    let _ = File::open(path)?;
    
    // 设置时间戳为2001-09-09 01:46:40
    let time = FileTime::from_unix_time(1_000_000_000, 0);
    set_file_times(path, time, time)
        .map_err(|e| {
            eprintln!("设置时间戳失败: {}", e);
            e
        })
}

注意事项

  1. 在某些操作系统上,创建时间(ctime)可能无法修改
  2. 需要适当的文件权限才能修改时间戳
  3. 对于符号链接,默认操作的是链接指向的文件而非链接本身

filetime_creation库提供了简单直观的方式来处理文件时间戳操作,非常适合需要精确控制文件时间属性的应用场景。

回到顶部