在 Rust 中如何删除目录中的所有文件而不是目录本身?

ANi*_*120 11 rust

如何删除目录中的所有文件而不删除目录本身?

我以为这会起作用,但它给出了一个错误:

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)