rust - 移动路径后,如何重命名给定路径的文件?
问题描述
我正在尝试重命名一个名为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
}
}
解决方案
正如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
}
}
推荐阅读
- c# - 如何在 C# 中进行单元测试
- javascript - 如何将动态复选框生成的值与数据库中的值进行比较,以防止提交时重复?
- c++ - 在类中,如何划分读取文本文件的功能和粘贴文本文件的功能?
- java - Android 找不到符号 BuildConfig
- c# - 如何在 C# 中跟随鼠标光标
- php - Laravel 无法为序列化准备路由 [{fallbackPlaceholder}]。使用闭包
- r - 读取超大文件 R 的列名和列值
- python - 将 Tkinter 按钮命令的结果用于另一个 Tkinter 命令函数
- matplotlib - 使用散点图 pyspark 使用标签命名数据点
- sql-server - 如何压缩 Liquibase 文件以反映当前数据库状态