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);
}
4条答案
按热度按时间e4yzc0pl1#
从Rust 1.9.0开始,有
OpenOptions::create_new
可以让你安全地和原子地确保你正在创建一个新文件。如果文件已经存在,则返回一个错误。如果设置了.create_new(true)
,则忽略.create()
和.truncate()
。如果要创建一个新文件,或者要打开已存在的文件,请使用
OpenOptions::create
。kokeuurv2#
我发现这个方法效果最好:
5jdjgkvh3#
这在C11中是可能的,或者通过直接使用低级OS API函数。
如果使用C11,则
fopen
允许您以"wx"
模式打开文件。否则,在Linux上,应该将
O_CREAT
和O_EXCL
都传递给open(3)
函数,或者在Windows上,将CREATE_NEW
传递给CreateFile()
函数的dwCreationDisposition
参数。**EDIT:**我最初忽略了
open
函数在C11中更新的事实。du7egjpx4#
**更新:**正如Mathieu大卫在评论中指出的,
std::path::Path
中的exists()
可以用来检查路径是否存在。旧答案:
在C语言中,检查文件名/路径是否存在通常是通过以下方式完成的:
如果文件存在,并且您具有所需的权限,则
access
返回0。我快速搜索了一个原生的Rust等价物,但什么也没找到,所以,你可能需要依赖
libc::access
来实现这一点。