根据字符串路径确定C中是否存在文件

时间:2011-10-12 02:59:51

标签: c

我有一个C字符串,我想用它来打开该文件。如何确定文件是否存在?

4 个答案:

答案 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()对此有用),但这会告诉您路径是否存在。