Rust:区分fs::remove_file错误处理的几种情况
Rust: Distinguish several cases in error handling of fs::remove_file
在 Rust 中,我想删除一个文件。 The documentation 告诉我 fs::remove_file
returns 如果文件是目录、不存在或用户缺少执行该操作的权限,则会出错。
现在,在我的场景中,我想区分这三种情况。但是,我的调试器没有向我显示错误类型,println!
结果只是打印错误消息。
那么,我该如何区分这些情况呢?
use std::fs;
fn rem(path: &str) {
let msg = match fs::remove_file(path) {
Ok(()) => "is fine",
Err(NotExist) => "does not exist", // TODO: Pattern
Err(IsDir) => "is a directory", // TODO: Pattern
Err(_) => "is not yours",
};
println!("The file {}!", msg);
}
fn main() {
rem("/tmp/this-file-hopefully-not-exists.xyz"); // print "not exist"
rem("/tmp/this-is-a-directory"); // prints "is a directory"
rem("/tmp/this-file-belongs-to-root.xyz"); // prints "is not yours"
}
std::fs::remove_file
returns一个std::io::Result<()>
,这只是Result<(), std::io::Error>
.
的一个别名
所以你可以匹配这个来提取错误信息的类型。特别是,您可能想要查看错误的 .kind()
:
fn rem(path: &str) {
use std::io::ErrorKind;
let message = match std::fs::remove_file(path) {
Ok(()) => "ok",
Err(e) if e.kind() == ErrorKind::NotFound => "not found",
Err(e) if e.kind() == ErrorKind::IsADirectory => "is a directory",
Err(e) => "other",
}
println!("{message}");
}
在 Rust 中,我想删除一个文件。 The documentation 告诉我 fs::remove_file
returns 如果文件是目录、不存在或用户缺少执行该操作的权限,则会出错。
现在,在我的场景中,我想区分这三种情况。但是,我的调试器没有向我显示错误类型,println!
结果只是打印错误消息。
那么,我该如何区分这些情况呢?
use std::fs;
fn rem(path: &str) {
let msg = match fs::remove_file(path) {
Ok(()) => "is fine",
Err(NotExist) => "does not exist", // TODO: Pattern
Err(IsDir) => "is a directory", // TODO: Pattern
Err(_) => "is not yours",
};
println!("The file {}!", msg);
}
fn main() {
rem("/tmp/this-file-hopefully-not-exists.xyz"); // print "not exist"
rem("/tmp/this-is-a-directory"); // prints "is a directory"
rem("/tmp/this-file-belongs-to-root.xyz"); // prints "is not yours"
}
std::fs::remove_file
returns一个std::io::Result<()>
,这只是Result<(), std::io::Error>
.
所以你可以匹配这个来提取错误信息的类型。特别是,您可能想要查看错误的 .kind()
:
fn rem(path: &str) {
use std::io::ErrorKind;
let message = match std::fs::remove_file(path) {
Ok(()) => "ok",
Err(e) if e.kind() == ErrorKind::NotFound => "not found",
Err(e) if e.kind() == ErrorKind::IsADirectory => "is a directory",
Err(e) => "other",
}
println!("{message}");
}