我该如何在 Rust 中列出一个目录下的所有文件?我正在寻找等价于以下 Python 代码的方法。
files = os.listdir('./')
我该如何在 Rust 中列出一个目录下的所有文件?我正在寻找等价于以下 Python 代码的方法。
files = os.listdir('./')
使用std::fs::read_dir()
。这里有一个示例:
use std::fs;
fn main() {
let paths = fs::read_dir("./").unwrap();
for path in paths {
println!("Name: {}", path.unwrap().path().display())
}
}
它将简单地迭代文件并打印出它们的名称。
extern crate glob;
use self::glob::glob;
let files:Vec<Path> = glob("*").collect();
[u8]
类型未能满足std::path::Path
中的特性约束[u8]: std::marker::Sized
(在std::path::Path
中,对于[u8]
类型,未实现std::marker::Sized
特性)[E0277]。 [u8]
在编译时没有已知的常量大小[E0277],因为它出现在类型std::path::Path
中[E0277],而这是std::vec::Vec
所需的[E0277]。 - Zelphir Kaltstahlextern crate glob;
use glob::glob;
fn main() {
for e in glob("../*").expect("Failed to read glob pattern") {
println!("{}", e.unwrap().display());
}
}
您可以查看源代码。
而要递归地遍历目录,则可使用walkdir
crate(Playground):
extern crate walkdir;
use walkdir::WalkDir;
fn main() {
for e in WalkDir::new(".").into_iter().filter_map(|e| e.ok()) {
if e.metadata().unwrap().is_file() {
println!("{}", e.path().display());
}
}
}
请参阅 The Rust Cookbook 的目录遍历部分。
fn recurse(path: impl AsRef<Path>) -> Vec<PathBuf> {
let Ok(entries) = read_dir(path) else { return vec![] };
entries.flatten().flat_map(|entry| {
let Ok(meta) = entry.metadata() else { return vec![] };
if meta.is_dir() { return recurse(entry.path()); }
if meta.is_file() { return vec![entry.path()]; }
vec![]
}).collect()
}
fn recurse_files(path: impl AsRef<Path>) -> std::io::Result<Vec<PathBuf>> {
let mut buf = vec![];
let entries = read_dir(path)?;
for entry in entries {
let entry = entry?;
let meta = entry.metadata()?;
if meta.is_dir() {
let mut subdir = recurse_files(entry.path())?;
buf.append(&mut subdir);
}
if meta.is_file() {
buf.push(entry.path());
}
}
Ok(buf)
}
std::io::fs::readdir
- Levans