检查C文件是否存在的最佳方法是什么? (跨平台)

有没有比简单地尝试打开文件更好的方法?

int exists(const char *fname)
{
    FILE *file;
    if ((file = fopen(fname, "r")))
    {
        fclose(file);
        return 1;
    }
    return 0;
}

查找在unistd.h找到的access()函数。 你可以用你的功能替换

if( access( fname, F_OK ) != -1 ) {
    // file exists
} else {
    // file doesn't exist
}

您还可以使用R_OKW_OKX_OK代替F_OK来检查读取权限,写入权限和执行权限(分别)而不是存在,并且您可以将它们中的任何一个(或者同时检查读取和写入权限使用R_OK|W_OK

更新:请注意,在Windows上,您不能使用W_OK来可靠地测试写权限,因为访问函数不考虑DACL。 access( fname, W_OK )可能会返回0(成功),因为该文件没有设置只读属性,但您仍可能没有写入文件的权限。


使用这样的stat:

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

并像这样称呼它:

if (file_exist ("myfile.txt"))
{
  printf ("It existsn");
}

通常当你想检查一个文件是否存在,这是因为你想创建该文件,如果它不存在。 格雷姆·佩罗的回答是好,如果你希望创建一个文件,但如果你这样做是脆弱的竞争状态:另一个进程可能会在您检查是否存在之间建立的文件,而你实际打开它来写吧。 (不要笑......如果创建的文件是符号链接,这可能会造成安全隐患!)

如果你想检查是否存在,并创建文件,如果它不存在, 原子,以便没有竞争条件,然后使用此:

#include <fcntl.h>
#include <errno.h>

fd = open(pathname, O_CREAT | O_WRONLY | O_EXCL, S_IRUSR | S_IWUSR);
if (fd < 0) {
  /* failure */
  if (errno == EEXIST) {
    /* the file already existed */
    ...
  }
} else {
  /* now you can use the file */
}
链接地址: http://www.djcxy.com/p/9245.html

上一篇: What's the best way to check if a file exists in C? (cross platform)

下一篇: How do I get a platform