可能重复:
检查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;
}
Run Code Online (Sandbox Code Playgroud)
更新:谢谢你们这些伟大的链接和解释!
Bri*_*ell 19
fopen实际上是尝试打开文件,如果您没有读取权限,则无法执行此操作.为了在不打开文件的情况下检查文件是否存在,请使用stat; stat为您提供有关该文件的元数据,并且只需要对包含该文件的目录的读访问权,而不是文件本身.
int doesFileExist(const char *filename) {
struct stat st;
int result = stat(filename, &st);
return result == 0;
}
Run Code Online (Sandbox Code Playgroud)
你可以通过检查errno是否result不是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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56051 次 |
| 最近记录: |