如何检查给定路径是文件还是目录?

25

我正在构建一个程序,可以接受文件路径(*.*)和目录路径(./..)。我希望能够检查提供的路径是文件还是目录。


对我来说不太清楚,请提供更多关于使用情况的细节。 - kebs
@kebs 主要用例是,如果用户提供了一个文件或某个类型的目录中的所有文件,例如:./*.js,它只会处理这些文件,但是如果用户想处理一个目录中包含的所有文件,则需要递归地处理它(我知道有一个名为walk_dir的模块可以实现此功能,但不太稳定)。或者,如果用户同时提供了文件链接和目录链接,则需要同时处理两者。 - XAMPPRocky
2个回答

44

您应该使用std::fs::metadata

use std::fs::metadata;

fn main() {
    let md = metadata(".").unwrap();
    println!("is dir: {}", md.is_dir());
    println!("is file: {}", md.is_file());
}

输出:

is dir: true
is file: false

参考一下,Rust API文档中“dir”有合理的搜索结果。撰写本文时的第三个结果是此答案中的解决方案。 - Shepmaster
5
是的,但公平地说,第二个结果是PathExt :: is_dir,它是不稳定的,因此可能不是作者要寻找的内容,尽管它也能实现他们想要的功能。 - fjh
2
这就是为什么我说“合理”而不是“很棒”。^_^ 希望它会变得更好!我主要想指出API参考文档也可以是一个很好的资源。 - Shepmaster
我在查看 Rust 文档,但我认为它应该是 std::fs::Filestd::path::Path 的一部分。 - XAMPPRocky
1
对于 Rust 1.5+,PathBuf 具有 is_file 方法。 - Shadi

6
rustc 1.67.1 (d5a82bbd2 2023-02-07) 开始,您可以使用 std::path::PathBuf
let path = PathBuf::from(".");
let is_dir = path.is_dir();
let is_file = path.is_file();
println!("is_dir: {is_dir}");
println!("is_file : {is_file}");

当您使用REPL执行代码时,这是输出结果:

Welcome to evcxr. For help, type :help
>> use std::path::PathBuf;
>> let path = PathBuf::from(".");
>> let is_dir = path.is_dir();
>> let is_file = path.is_file();
>> println!("is_dir: {is_dir}");
is_dir: true
>> println!("is_file : {is_file}");
is_file : false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接