如何在 Rust 中使用单一方法创建文件及其父目录?

fab*_*iim 7 file rust

我可以使用OpenOptions或类似的单一方法打开创建它及其父目录的文件吗?

这只会创建一个新文件,如果我的路径包含不存在的目录,则它不起作用:

pub fn save_file(file_path: String) -> Result<(), Error> {
    let mut db_file = OpenOptions::new()
        .create(true)
        .append(true)
        .open(file_path)?;
    db_file.write_all(b"some content")?;
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

Rog*_*mbe 11

我无法找到一个单一的方法来做到这一点,但这里是如何在一个给定的文件中创建父目录(等)2(如果不计let path =......)。

let path = std::path::Path::new("/home/roger/foo/bar/baz.txt");
let prefix = path.parent().unwrap();
std::fs::create_dir_all(prefix).unwrap();
Run Code Online (Sandbox Code Playgroud)

  • 虽然您的担忧是正确的,但他们没有询问任何与安全相关的问题。提供处理每种情况的完整解决方案,在经过一些健全性检查后,仍然在某个地方包含这个确切的代码,这是完全没有意义的,他们询问如何做到这一点,而这正是你如何做到的,这不是我们的工作来确保他们编写的代码实际上是安全的,尽管我确实同意上面或代码中提到与安全相关的问题会很好,这就是为什么您可以根据需要编辑它,尽管:) (5认同)
  • 这里似乎没有 C,只有 U。你总是无条件地调用 `create_dir_all`。 (4认同)
  • @Sahsahae 我不同意。如果这段代码有 TOCTOU 竞争条件,那么无论有任何安全问题,它都会是错误的。这种竞争条件是一个错误。但该代码根本没有竞争条件。 (2认同)