【问题标题】:How to check if a file exists before writing to it [duplicate]如何在写入文件之前检查文件是否存在[重复]
【发布时间】:2015-02-21 03:03:36
【问题描述】:

相当不言自明,我如何在用 C 写入文件之前检查文件是否存在。

【问题讨论】:

  • 以读取方式打开,查看是否成功
  • 如果您有 POSIX,并且您只是想确保在打开现有文件进行写入时不会破坏它,请包括 O_EXCL 模式和 O_CREAT。这是一个原子测试;没有TOCTOU(检查时间,使用时间)漏洞窗口。一般使用'Easier to Ask Forgiveness than Permission' (EAFP) rather than 'Look Before You Leap' (LBYL)测试比较好。
  • 使用 POSIX open() 提供的选项,通常可以达到您需要的效果。如果您需要文件流,请使用fdopen() 从打开的文件描述符中创建一个。
  • 如何在写入文件之前检查文件是否存在?别。不能保证在您检查之后但在您编写之前,其他东西不会创建文件。相反,使用O_CREAT 和O_EXCL 标志打开文件(并检查EEXIST 错误)以避免竞争条件。

标签: c


【解决方案1】:

最喜欢的是access:

/* test that file exists (1 success, 0 otherwise) */
int xfile_exists (char *f)
{
    /* if access return is not -1 file exists */
    if (access (f, F_OK ) != -1 )
        return 1;

    return 0;
}

注意:access() 由 POSIX 定义,而不是 C,因此其可用性因编译器而异。

【讨论】:

  • 并且说最喜欢的有问题 - 请参阅副本的 cmets,其中接受的答案也使用 access() 但可以说不应该。
  • 谢谢。主要在单个操作系统上工作,可用性问题经常被忽略。我删除了关于它的可用性和定义的注释。
猜你喜欢
  • 2015-11-22
  • 2018-02-20
  • 2011-05-18
  • 2017-09-15
  • 2019-03-07
  • 2011-02-07
  • 2013-07-22
  • 2012-01-25
相关资源
最近更新 更多