首页 > 解决方案 > 等效于 GLib 中的 open(O_WRONLY | O_CREAT)?

问题描述

我需要打开一个文件进行写入。如果文件已经存在,我不想截断它。

换句话说,在普通的 C 中,我会这样做:

int fd = open("output.bin", O_WRONLY | O_CREAT, 0666);
// I don't mind using O_RDWR, btw.

我正在尝试对 GLib 的 GFile(GIO 的一部分)做类似的事情。我第一次尝试:

g_file_create(gfile, G_FILE_CREATE_NONE, NULL, NULL);

但如果文件已经存在,这将失败。

我看到大约有 5 个其他函数返回GFileOutputStreamor GFileIOStream,但我不太看到有一个函数可以满足我的要求。

我错过了什么吗?

我需要把这个简单的任务分成几个小任务吗?(检查文件是否存在;如果存在,则创建,否则打开;都以某种方式包裹在锁中。)

(顺便说一句,如果重要的话:我的文件将驻留在本地文件系统上,而不是网络文件系统上。另外,我在 Vala 工作,这就是为什么我不简单地使用open()(也许我可以找到它的绑定,但我更喜欢学习 GIO 做事的方式)。)

标签: cglibvalagio

解决方案


我最终分两步完成了这项工作。我使用了@usr 的检查建议G_IO_ERROR_EXISTS。我的代码:

public class Downloader {

  public FileIOStream iostream;

  public OutputStream output { get { return iostream.output_stream; } }

  public void create_output_file() throws Error
  {
    File file = File.new_for_path("output.bin");
    try {
      // If file doesn't exist.
      iostream = file.create_readwrite(NONE);
    } catch (Error e) {
      if (e is IOError.EXISTS)
        // It exists.
        iostream = file.open_readwrite();
      else
        throw e;
    }
  }

}

(这里可能存在竞争条件,但在我的情况下无关紧要。)


推荐阅读