【问题标题】:creat() overwrite my filecreate() 覆盖我的文件
【发布时间】:2016-09-30 01:34:08
【问题描述】:

我在 linux 上用creat 函数写了一段小 C 代码。我用相同的文件名和相同的mode 使用它几次,每次它都用新的时间和权限覆盖我的文件,没有EEXIST 错误。

 if (creat(name, mode) < 0)
{
    printf("something went wrong with create! %s\n", strerror(errno));
    exit(1);
}

有什么问题?

【问题讨论】:

  • 如果这不是你想要的,你为什么打电话给creat?!
  • 我想创建,但我希望它先检查这个文件是否存在。
  • 您能非常非常具体地说明您想要做什么吗?如果文件已经存在,你想发生什么?如果文件不存在,你想发生什么?如果文件存在但是是符号链接,你想发生什么?

标签: c linux filenames file-permissions


【解决方案1】:

EEXIST 仅在 O_CREAT | O_EXCL 用于 open 的标志中时返回。虽然creat(2) 确实暗示了O_CREAT,但它并不暗示O_EXCL,仅暗示了O_CREAT | O_WRONLY | O_TRUNC

您应该改用open

【讨论】:

  • 所以每次我想创建一个文件我都需要先尝试打开它?有没有办法在创建时检查文件是否存在以避免覆盖它?
  • @DvirNaim 你想打开一个文件,如果它不存在就创建它,如果它存在就失败?那是对的吗?如果是这样,您不需要尝试“首先”打开它,您需要做的就是尝试以这样一种方式打开它,如果文件已经存在,则打开失败。
  • 找到了..我坚信 creat 会为我完成这项工作..我很累...stackoverflow.com/questions/230062/…
  • 但是creat() 也会打开文件!
【解决方案2】:

creat()函数同:

open(path, O_CREAT | O_TRUNC | O_WRONLY, mode);

你需要标志O_APPEND写在文件的末尾

所以你应该使用open() read() write()

编辑

示例:

#include <fcntl.h>
#include <unistd.h>

int is_file_exist (char *filename)
{
  struct stat   buffer;   
  return (stat (filename, &buffer) == 0);
}

void open_read_write() {
  int fd;

  if (!is_file_exist("./file"))
    return ;
  // open a file descriptor, if not, create
  fd = open("./file", O_RDWR | O_APPEND);
  // thanks to O_APPEND, write() writes at the end of the file
  write(fd, "hello world\n", 12);
  // close the file descriptor
  close(fd); // important !
}

【讨论】:

  • 所以每次我想创建一个文件我都需要先尝试打开它?有没有办法在创建时检查文件是否存在以避免覆盖它?
  • 没错,但是您可以创建自己的函数来轻松完成任务open() 函数为您提供file descriptor,它是读取或写入文件所必需的
  • 如何..?我需要哪些工具..?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2013-11-26
  • 2016-03-11
  • 2020-07-23
  • 2015-02-27
  • 1970-01-01
  • 2013-06-07
相关资源
最近更新 更多