c - 等效于 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 个其他函数返回GFileOutputStream
or GFileIOStream
,但我不太看到有一个函数可以满足我的要求。
我错过了什么吗?
我需要把这个简单的任务分成几个小任务吗?(检查文件是否存在;如果存在,则创建,否则打开;都以某种方式包裹在锁中。)
(顺便说一句,如果重要的话:我的文件将驻留在本地文件系统上,而不是网络文件系统上。另外,我在 Vala 工作,这就是为什么我不简单地使用open()
(也许我可以找到它的绑定,但我更喜欢学习 GIO 做事的方式)。)
解决方案
我最终分两步完成了这项工作。我使用了@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;
}
}
}
(这里可能存在竞争条件,但在我的情况下无关紧要。)
推荐阅读
- angular - 通过单击自动完成材料选择
- json - insertOne 将对象的数值保存为字符串?
- android - ProGuard 实现与 R8 与 VS2019 之间的冲突
- python - 在 python 3 中对变量使用 Unicode 希腊符号
- html - Bootstrap 4折叠导航栏无法正常工作
- vba - DoCmd.TransferDatabase 问题
- java - 在 Thorntail 中使用 ActiveMQ 配置 JMS
- cordova - 如何在不同的 PhoneGap 项目中共享一些源文件?
- java - 使用“纯”Java 播放 DRM 加密视频流
- javascript - 如何将html页面内容打印到打印机