首页 > 解决方案 > 移动路径后,如何重命名给定路径的文件?

问题描述

我正在尝试重命名一个名为settings.ron->的文件setting.invalid.ron,因为它的路径settings.ron可能会根据环境而改变。

我在移动读取操作path中已经借用的值时遇到了麻烦。File

impl Settings {
    pub fn load() -> Self {
        let path = Settings::get_settings_path();
        if let Ok(file) = fs::File::open(path) {
            match ron::de::from_reader(file) {
                Ok(x) => x,
                Err(e) => {
                    log::warn!("Failed to parse setting file! Fallback to default. {}", e);
                    path.with_file_name("settings.invalid.ron");
                }
            }
        }
        let default_settings = Self::default();
        default_settings.save_to_file_warn();
        default_settings
    }
}

我让它工作了,但是必须创建一个额外的变量似乎很奇怪:

impl Settings {
    pub fn load() -> Self {
        let path = Settings::get_settings_path();
        let mut path_buf = path.to_owned();
        if let Ok(file) = fs::File::open(path) {
            match ron::de::from_reader(file) {
                Ok(x) => x,
                Err(e) => {
                    log::warn!("Failed to parse setting file! Fallback to default. {}", e);
                    path_buf.set_file_name("settings.invalid.ron");
                }
            }
        }
        let default_settings = Self::default();
        default_settings.save_to_file_warn();
        default_settings
    }
}

标签: rust

解决方案


正如Sven Marnach 所说,诀窍是传递一个参考File::open()

impl Settings {
        pub fn load() -> Self {
        let mut path = Settings::get_settings_path();
        if let Ok(file) = fs::File::open(&path) {
            match ron::de::from_reader(file) {
                Ok(x) => x,
                Err(e) => {
                    log::warn!("Failed to parse setting file! Fallback to default. {}", e);
                    // Rename the corrupted settings file
                    let mut new_path = path.to_owned();
                    new_path.pop();
                    new_path.push("settings.invalid.ron");
                    if let Err(err) = std::fs::rename(path, new_path) {
                        log::warn!("Failed to rename settings file. {}", err);
                    }
                }
            }
        }
        let default_settings = Self::default();
        default_settings.save_to_file_warn();
        default_settings
    }
}

推荐阅读