【问题标题】:Rename script deleting images instead of renaming them重命名脚本删除图像而不是重命名它们
【发布时间】:2023-01-26 01:14:03
【问题描述】:

我想从文件夹中的 png 图像中删除 _

use std::error::Error;
use std::fs;
use std::path::Path;

fn main() -> Result<(), Box<dyn Error>> {
    let dir = Path::new("/home/alex/Desktop");
    for entry in fs::read_dir(dir)? {
        let entry = entry?;
        let path = entry.path();
        if path.is_file() && path.extension().unwrap_or_default() == "png" {
            if let Some(Some(new_path)) = path
                .file_name()
                .map(|name| name.to_str().map(|s| s.replace("_", "")))
            {
                fs::rename(path, new_path)?;
            }
        }
    }
    Ok(())
}

代码是“删除” png 文件而不是重命名它们。我怀疑这是因为它们被重命名为不存在的位置。但我不太确定如何修改代码来解决这个问题。

直播码:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=323f901e4f0f4c99dbf5affeb0127991

【问题讨论】:

    标签: rust


    【解决方案1】:

    代码的问题是没有正确构建新的文件路径。您不应将 new_path 传递给 fs::rename 方法,而应构造一个新的 Path 对象,该对象包含修改后的文件名和与原始文件相同的父目录。

    以下是如何修改代码以解决问题的示例:

    let dir = Path::new("/home/alex/Desktop");
    for entry in fs::read_dir(dir)? {
        let entry = entry?;
        let path = entry.path();
        if path.is_file() && path.extension().unwrap_or_default() == "png" {
            if let Some(name) = path.file_name().and_then(|n| n.to_str()) {
                let new_name = name.replace("_", "");
                let new_path = path.with_file_name(new_name);
                fs::rename(path, new_path)?;
            }
        }
    }
    

    这样,您就可以使用 Path::with_file_name() 方法构造一个具有修改后的文件名的新路径对象,但保留与原始文件相同的父目录。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2018-08-13
      • 2012-07-23
      • 2020-09-16
      • 2022-01-21
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      相关资源
      最近更新 更多