2012-12-19 114 views
7

可能重复:
What’s the best way to check if a file exists in C? (cross platform)C,检查文件是否存在而不能读/写可能?

我想检查文件是否存在。我将我的测试文件的权限更改为“chmod -r somefile”。但是现在它说文件即使存在也不存在。

因此,我假设如果我没有读取权限,我无法打开与“fopen r”文件。但是这意味着没有简单的方法可以判断文件是否存在或者无法读取/写入?

或者我错过了什么?任何帮助都会很棒。

谢谢!

int doesFileExist(const char* filename) 
{ 
    FILE* fptr = fopen(filename, "r"); 
    if (fptr != NULL) 
    { 
    fclose(fptr); 
    printf("File exists\n"); 
    return 1; 
    } 
    printf("File doesnt exist\n"); 
    return 0; 
} 

更新:谢谢你们这些伟大的链接和解释!

+1

呃..你有没有检查过'errno'?编辑:试试这个得到一些错误信息:'printf(“文件不存在:%s \ n”,strerror(errno));'不要忘记包含'errno.h'头文件。 – Jack

+0

这就是我讨厌stdio API的原因,无论何时你需要做一些不平凡的事情如调整文件大小,或者移动文件而不复制它并删除旧文件,在可移植性方面你都会走运。 – Thomas

回答

18

fopen实际上会尝试打开文件,如果您没有读取权限,则不能执行此操作。为了在不打开文件的情况下检查文件是否存在,请使用stat; stat为您提供有关文件的元数据,只需要读取包含文件的目录,而不是文件本身。

int doesFileExist(const char *filename) { 
    struct stat st; 
    int result = stat(filename, &st); 
    return result == 0; 
} 

你可以通过检查errno如果result不为0时更大胆的尝试;如果errnoENOENT那么文件不存在,如果它是ENOTDIR那么你提供的路径的一部分不是目录,如果它是EACCESS那么你没有读取路径中的目录之一的权限,所以stat可以给你一个答案,等等。另外,请注意,如果您使用符号链接(任何类Unix或Windows Vista或更高版本)的平台,那么您应该注意是否查询符号链接或它指向的文件。如果你打电话给stat,那么你问的是它指向的文件;如果你有一个符号链接dir/link,它指向other/file,那么stat将返回关于other/file的结果(这通常是你想要的,因为如果你打开文件就会得到这个结果)。但是,如果您对链接本身感到好奇(如果您想知道“dir/link是否存在,即使other/file不存在?”),那么您应该使用lstat()

stat()在Windows上作为兼容性包装(他们更喜欢使用_stat(),如果不这样做会发出警告),但通常使用本机平台API更好。在Windows上,您应该使用GetFileAttributes()

int doesFileExist(const char *filename) { 
    return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; 
} 
-1

在Linux(和许多其他系统)上,您可以使用opendir()和朋友列出目录。我猜只读文件会显示出来。其他平台上应该有类似的功能。

1

你并没有真正检查文件是否存在这里...你正在检查你是否可以通过读访问来打开它。由于文件不存在以外的原因,它可能会失败。正如你所看到的,你可能没有读取权限。也可能是该文件被锁定。

检查这个答案:

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

它建议使用stat,它应该在大多数情况下,除非你没有读就在该文件所在的目录访问。

相关问题