【发布时间】:2012-03-17 23:22:15
【问题描述】:
我正在尝试在 C 应用程序中打开文件。在尝试读取文件之前如何检查文件是否存在?
【问题讨论】:
我正在尝试在 C 应用程序中打开文件。在尝试读取文件之前如何检查文件是否存在?
【问题讨论】:
你应该检查fopen的结果。
FILE *fp;
if (!(fp = fopen(name, "r"))) {
perror("fopen");
/* Handle error, return, exit, try again etc. */
}
/* Normal code goes on. */
如果fopen 返回NULL,则文件由于某种原因无法访问。它可能丢失或者进程没有权限。
【讨论】:
errno 的值,了解fopen 失败的原因; ENOENT 如果文件不存在。
你可以这样做:
bool file_exists(const char * filename) {
if (FILE * file = fopen(filename, "r")) {
fclose(file);
return true;
}
return false;
}
基本上只要打开文件并检查它是否成功。
【讨论】:
stat(如果有)。
你打开文件,查看fopen()或open()的返回值。
【讨论】:
尝试打开它:
FILE * file;
file = fopen("file_name", "r");
if (file){
//file exists and can be opened
//...
// close file when you're done
fclose(file);
}else{
//file doesn't exists or cannot be opened (es. you don't have access permission)
}
【讨论】:
fclose(file)。当您所做的只是查看文件是否打开时,很容易忘记关闭流,但如果您不打开,那么您的应用程序和其他应用程序都无法打开文件,直到您的应用程序退出等,这是为了防止多个程序同时对同一个文件进行写操作,因为这样做没有任何意义。
存在:调用stat(),查看返回码,没有副作用。在 UNIX 上,也请致电 access()。
如果您只是按照您的要求执行此操作,FileA 是否存在,我不一定可以打开它。示例:在 UNIX 中,具有仅执行权限的文件将无法打开,但仍然存在。
使用stat,您可以检查 st_mode 的访问权限。但是,既然您无论如何都打算打开该文件,那么fopen 或open 可能就是您想要的。
【讨论】:
stat 一点也不晦涩。 Unix 不是 SO 上的首选操作系统。但除非 OP 要求特定的操作系统,否则我不明白为什么与最常用的操作系统(即 *NIX 和 Windows)相关的答案不是好的答案。