Rust 文件操作:文件改名详解_rust 文档
Rust 文件操作:文件改名详解
嘿,朋友们!今天咱们来聊聊 Rust 里的文件改名,这可是个很实用的技能!让我用大白话给你讲明白。
为什么要改名?
想象一下:
- 你写了个程序,生成了很多日志文件
- 早上生成的叫 log_001.txt,下午叫 log_002.txt
- 但是你突然发现文件名太乱了,想改成 log_2024_01_01.txt 这样有规律的格式
这就是文件改名的用武之地!
Rust 中怎么改名?
基础方法:std::fs::rename()
rust
use std::fs;fn main() {
// 把 old_file.txt 改名为 new_file.txt
let result = fs::rename("old_file.txt", "new_file.txt");
match result {
Ok(_) => println!("文件改名成功!"),
Err(e) => println!("改名失败:{}", e),
}
}
实际案例演示
场景1:备份文件
rust
use std::fs;
use std::io;fn backup_file(original_name: &str, backup_name: &str) -> io::Result<()> {
// 先检查原文件是否存在
if !std::path::Path::new(original_name).exists() {
return Err(io::Error::new(
io::ErrorKind::NotFound,
"原文件不存在"
));
}
// 进行备份改名
fs::rename(original_name, backup_name)?;
println!(" {} 已备份为 {}", original_name, backup_name);
Ok(())
}fn main() {
// 举例:把 config.toml 备份成 config_backup.toml
let result = backup_file("config.toml", "config_backup.toml");
if let Err(e) = result {
println!(" 备份失败:{}", e);
}
}
场景2:批量重命名
rust
use std::fs;
use std::path::Path;fn batch_rename() {
// 假设我们有这些文件:
// image_001.jpg, image_002.jpg, image_003.jpg
for i in 1..=5 {
let old_name = format!("image_{:03}.jpg", i);
let new_name = format!("photo_{:03}.jpg", i);
// 检查文件是否存在
if Path::new(&old_name).exists() {
match fs::rename(&old_name, &new_name) {
Ok(_) => println!(" {} -> {}", old_name, new_name),
Err(e) => println!(" 重命名失败 {}: {}", old_name, e),
}
}
}
}fn main() {
batch_rename();
}
注意事项
1. 文件必须存在
rust
use std::fs;// 这样会失败,因为文件不存在
let result = fs::rename("不存在的文件.txt", "新的文件名.txt");// 先检查文件是否存在
let file_path = "test.txt";
if std::path::Path::new(file_path).exists() {
fs::rename(file_path, "renamed_test.txt").unwrap();
} else {
println!("文件不存在!");
}
2. 权限问题
rust
use std::fs;
use std::io;fn safe_rename(old_name: &str, new_name: &str) -> io::Result<()> {
// 检查原文件是否可读
if !std::path::Path::new(old_name).exists() {
return Err(io::Error::new(
io::ErrorKind::NotFound,
format!("文件 {} 不存在", old_name)
));
}
// 尝试改名
fs::rename(old_name, new_name)?;
println!(" 成功将 {} 改名为 {}", old_name, new_name);
Ok(())
}fn main() {
let result = safe_rename("data.txt", "new_data.txt");
if let Err(e) = result {
println!(" 改名失败:{}", e);
// 可能的原因:
// 1. 没有写权限
// 2. 文件被其他程序占用
// 3. 目标路径没有写入权限
}
}
高级用法:带日志的改名
rust
use std::fs;
use std::io::{self, Write};
use std::time::SystemTime;fn rename_with_log(old_name: &str, new_name: &str) -> io::Result<()> {
println!(" 准备将 {} 改名为 {}", old_name, new_name);
// 记录操作日志
let log_entry = format!(
"[{}] 重命名: {} -> {}\n",
SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)
.unwrap()
.as_secs(),
old_name,
new_name
);
// 写入日志文件
std::fs::OpenOptions::new()
.create(true)
.append(true)
.open("rename_log.txt")?
.write_all(log_entry.as_bytes())?;
// 执行改名
fs::rename(old_name, new_name)?;
println!(" 改名成功!");
Ok(())
}fn main() {
// 使用示例
if let Err(e) = rename_with_log("temp_file.txt", "final_file.txt") {
println!(" 操作失败:{}", e);
}
}
实用小技巧
技巧1:自动避免重名
rust
use std::fs;
use std::path::Path;fn rename_unique(old_name: &str, base_new_name: &str) -> io::Result<String> {
let mut counter = 1;
let mut new_name = base_new_name.to_string();
// 如果文件已存在,自动加数字后缀
while Path::new(&new_name).exists() {
new_name = format!("{}_{}.txt", base_new_name, counter);
counter += 1;
}
fs::rename(old_name, &new_name)?;
Ok(new_name)
}fn main() {
// 如果 test.txt 已经存在,会自动变成 test_1.txt、test_2.txt...
let new_name = rename_unique("test.txt", "backup");
println!("新文件名:{}", new_name);
}
技巧2:改名前备份
rust
fn backup_and_rename(old_name: &str, new_name: &str) -> io::Result<()> {
// 先备份原文件
let backup_name = format!("{}.backup", old_name);
fs::copy(old_name, &backup_name)?;
println!(" 已创建备份:{}", backup_name);
// 再改名
fs::rename(old_name, new_name)?;
println!(" 原文件已改名为:{}", new_name);
Ok(())
}
总结一下
文件改名就像搬家:
- 要确认原房子(文件)存在
- 要确认新地址(目标路径)可到达
- 要确保搬家过程中没人阻拦(权限问题)
- 最好提前记录一下(日志)
记住这些关键词:
- fs::rename() - 核心函数
- Result - 错误处理
- Path::new().exists() - 检查文件是否存在
- OpenOptions - 高级文件操作
现在你就可以在 Rust 里自由地给文件改名啦!记住,文件改名虽然简单,但也要小心谨慎哦~