如果文件已存在(写入模式),fopen会失败吗?

时间:2014-10-16 01:33:59

标签: c file

我希望使用fopen("/temp/abc.txt", "w")

打开一个新文件

我希望如果文件已经存在,fopen应该失败,以便我可以通过更改名称来重试。前 - 重命名为abc_1.txt

access()不是我首选的方式,因为在access()电话检查之后和fopen()之前可能会创建文件。

处理此问题的更好方法是什么?

3 个答案:

答案 0 :(得分:3)

在C11中,fopen supports a new mode modifier "x"可以满足您的需求。但是,我并不知道在早期标准中有任何可移植的方法。

大多数操作系统都在其特定于平台的文件打开原语中支持这样的标志。在POSIX系统上,这可以通过O_EXCL实现,而在Windows上可以通过CREATE_ALWAYS实现。

答案 1 :(得分:3)

在POSIX系统上,您可以使用open()函数或其中一个亲戚来创建文件,返回文件描述符,然后使用fdopen()从文件描述符创建文件流。除了其他优点之外,这还允许您控制对标准I / O库允许的文件创建的权限。

int fd = open(target_file, O_CREAT | O_EXCL | O_RDWR, 0600);
if (fd < 0)
    …report error and return or exit…
FILE *fp = fdopen(fd, "w+");
if (fp == 0)
    …report error and return or exit…

…use file stream fp…

fclose(fp);
// Do not close(fd) too, and especially not before the fclose(fp)!

答案 2 :(得分:0)

作为一个随机的想法,如果你不想/不能使用“x”标志(这可能是最好的方法),你可以尝试使用“a”而不是“w”,然后检查tell() == 0。但是,这将接受不存在的文件和空文件。