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

t3irkdon  于 2022-12-19  发布在  其他
关注(0)|答案(4)|浏览(384)

OpenOptions似乎不支持这种情况,现有文件将被截断或覆盖。

e4yzc0pl

e4yzc0pl1#

从Rust 1.9.0开始,有OpenOptions::create_new可以让你安全地和原子地确保你正在创建一个新文件。如果文件已经存在,则返回一个错误。如果设置了.create_new(true),则忽略.create().truncate()
如果要创建一个新文件,或者要打开已存在的文件,请使用OpenOptions::create

kokeuurv

kokeuurv2#

我发现这个方法效果最好:

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);
    }
5jdjgkvh

5jdjgkvh3#

这在C11中是可能的,或者通过直接使用低级OS API函数。
如果使用C11,则fopen允许您以"wx"模式打开文件。
否则,在Linux上,应该将O_CREATO_EXCL都传递给open(3)函数,或者在Windows上,将CREATE_NEW传递给CreateFile()函数的dwCreationDisposition参数。

**EDIT:**我最初忽略了open函数在C11中更新的事实。

du7egjpx

du7egjpx4#

**更新:**正如Mathieu大卫在评论中指出的,std::path::Path中的exists()可以用来检查路径是否存在。
旧答案:

在C语言中,检查文件名/路径是否存在通常是通过以下方式完成的:

! access(filename, F_OK)

如果文件存在,并且您具有所需的权限,则access返回0。
我快速搜索了一个原生的Rust等价物,但什么也没找到,所以,你可能需要依赖libc::access来实现这一点。

相关问题