有没有办法创建和打开一个文件,如果它不存在但是否则失败?

时间:2016-02-25 19:39:27

标签: rust

看起来OpenOptions不支持此方案,现有文件将被截断或覆盖。

4 个答案:

答案 0 :(得分:7)

从Rust 1.9.0开始,有OpenOptions::create_new使您可以安全地和原子地确保创建新文件,否则您的命令将失败。

答案 1 :(得分:4)

可以在C11中使用,也可以直接使用低级OS API函数。

如果您使用C11,则fopen允许您以"wx"模式打开文件。

否则,在Linux上,应该将O_CREATO_EXCL都传递给open(3)函数。或者,在Windows上,将CREATE_NEW传递给CreateFile()函数的dwCreationDisposition参数。

编辑:我最初错过了open功能已在C11中更新的事实。

答案 2 :(得分:2)

更新:正如Mathieu David在评论中指出的那样。来自exists() std::path::Path可用于检查路径是否存在。

旧答案:

  

在C中,检查文件名/路径是否存在通常用:

完成
! access(filename, F_OK)
     如果文件存在,

access将返回0,前提是您具有所需的权限。

     

我快速搜索了当地的Rust等效物,却找不到任何东西。因此,您可能需要依赖libc::access

答案 3 :(得分:0)

我发现这最有效:

use std::fs;
use std::fs::OpenOptions;
use std::io::prelude::*;

if Path::new(file).exists() {
  fs::remove_file(file).unwrap();
}

File::create(TMP_ADDS).unwrap();
    let mut file = OpenOptions::new()
        .create_new(true)
        .write(true)
        .append(true)
        .open(file)
        .unwrap();

    if let Err(e) = writeln!(file, "{}", line) {
        eprintln!("Couldn't write to file: {}", e);
    }