如何删除目录中的所有文件而不删除目录本身?
我以为这会起作用,但它给出了一个错误:
for entry in std::fs::read_dir("tmp/my_items") {
std::fs::remove_file(entry);
}
Run Code Online (Sandbox Code Playgroud)
the trait `AsRef<std::path::Path>` is not implemented for `ReadDir`
Run Code Online (Sandbox Code Playgroud)
Val*_*tin 14
如果该目录未被使用、监视或其他任何阻止其被删除的情况。然后你可以使用删除整个目录fs::remove_dir_all()并在使用后立即创建它fs::create_dir(),即:
use std::fs;
let path = "tmp/my_items";
fs::remove_dir_all(path).unwrap();
fs::create_dir(path).unwrap();
Run Code Online (Sandbox Code Playgroud)
否则,您似乎混淆了fs::read_dir()实际返回的内容。
它返回一个Result<ReadDir>需要解包的。然而,虽然ReadDir实现了Iterator,但它实际上并不产生路径。它实际上生成Result<DirEntry>,它也需要解包,但仍然不是路径。要获取实际路径,您必须调用path().
use std::fs;
use std::io;
use std::path::Path;
fn remove_dir_contents<P: AsRef<Path>>(path: P) -> io::Result<()> {
for entry in fs::read_dir(path)? {
fs::remove_file(entry?.path())?;
}
Ok(())
}
fn main() {
remove_dir_contents("tmp/my_items").unwrap();
}
Run Code Online (Sandbox Code Playgroud)
如果目录不仅严格包含文件,那么您还需要检查文件类型并删除目录及其内容。
use std::fs;
use std::io;
use std::path::Path;
fn remove_dir_contents<P: AsRef<Path>>(path: P) -> io::Result<()> {
for entry in fs::read_dir(path)? {
let entry = entry?;
let path = entry.path();
if entry.file_type()?.is_dir() {
remove_dir_contents(&path)?;
fs::remove_dir(path)?;
} else {
fs::remove_file(path)?;
}
}
Ok(())
}
Run Code Online (Sandbox Code Playgroud)