看起来OpenOptions
不支持此方案,现有文件将被截断或覆盖。
答案 0 :(得分:7)
从Rust 1.9.0开始,有OpenOptions::create_new
使您可以安全地和原子地确保创建新文件,否则您的命令将失败。
答案 1 :(得分:4)
可以在C11中使用,也可以直接使用低级OS API函数。
如果您使用C11,则fopen
允许您以"wx"
模式打开文件。
否则,在Linux上,应该将O_CREAT
和O_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);
}