我有一个C字符串,我想用它来打开该文件。如何确定文件是否存在?
答案 0 :(得分:5)
使用名为access()的函数
if(access(file_path, F_OK)==0)
//file exists
else
// file does not exists
答案 1 :(得分:1)
每个人的答案都是有效的(有小问题),但要做出一些假设。首先,如果它实际上是您检查的文件,或者它可能是文件/目录/ symlink / fifo / socket /等。如果它只是一个文件,fopen(),stat()和access()解决方案将无法正常工作。
fopen()将在许多操作系统(包括有效目录)中的几乎所有对象类型上成功,而stat()和access()肯定会成功,无论所有操作系统中的文件系统对象类型如何(它们将始终成功)是一个文件系统对象,可以在当前安全上下文[登录用户]中访问。更糟糕的是,Windows编译器会以不同的方式处理统计信息(因为它们要么链接到msvc的lib,要么内联它们自己的实现)。
可悲的是,您最好的方法(如果确定文件是否存在并且您想要是否可移植)就像......
#ifdef _WIN32
#include <windows.h>
#else
#include <sys/stat.h>
#include <unistd.h>
#endif
int file_exists(const char* filename) {
#ifdef _WIN32
HANDLE h = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
if (h == INVALID_HANDLE_VALUE)
return 0;
int res = 0;
if (GetFileType(h) == FILE_TYPE_DISK)
res = 1;
CloseHandle(h);
return res;
#else
struct stat st;
if (stat(filename, &st) == -1)
return 0;
return S_ISREG(st.st_mode);
#endif
return 0;
}
答案 2 :(得分:0)
在大多数情况下,最简单的方法是打开文件进行书写。如果出现问题,您将获得一个NULL文件句柄。
#include <stdio.h>
int fileExists(const char* path) {
FILE* f = fopen(path, "rb");
if (!f) {
return 0;
}
fclose(path);
return 1;
}
当然,如果你想要从文件中读取,你不应该立即fclose()句柄。
答案 3 :(得分:0)
您也可以使用stat
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
struct stat s;
if (stat("/path/to/file", &s) == -1) {
printf("Invalid path\n");
} else {
printf("Valid path\n");
}
return 0;
}
这并不能告诉您程序是否具有读取或写入文件的权限(fopen()
对此有用),但这会告诉您路径是否存在。