fopen
实际上会尝试打开文件,如果您没有读取权限,则无法执行此操作。为了在不打开文件的情况下检查文件是否存在,请使用stat
; stat
为您提供有关文件的元数据,并且只需要对包含文件的目录而不是文件本身的读取权限。
int doesFileExist(const char *filename) {
struct stat st;
int result = stat(filename, &st);
return result == 0;
}
你可以通过检查errno
if result
is not 0 来变得更漂亮;如果errno
是ENOENT
,则文件不存在,如果是,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;
}