如何检查文件是否存在(无论文件类型如何)?

时间:2017-06-05 06:24:41

标签: c++ linux

编辑:问题不在于我的c ++。问题在于我如何在GameMaker Studio中调用共享库,这就是它无法正常工作的原因。

我正在尝试检测文件是否存在,并且我在互联网上尝试了很多方法,但它们似乎都没有用。这是一个例子:

double file_exists(char *filename)
{
    std::ifstream infile(filename);
    return infile.good();
}

我认为它只适用于文本文件。例如,这不起作用:

file_exists("/usr/bin/gedit");

...因为那是一个Linux可执行文件。

我想要一种方法来检查文件是否存在而不管其文件类型如何。

在Windows上,这可以很容易地实现:

double file_exists(char* filename)
{
    DWORD fileAtt = GetFileAttributesA(filename);
    if(fileAtt == INVALID_FILE_ATTRIBUTES)
        throw GetLastError();

    return (bool)((fileAtt&FILE_ATTRIBUTE_DIRECTORY) == 0);
}

但我在Linux上,我需要一个与Linux相同的上述代码片段。

2 个答案:

答案 0 :(得分:2)

在Linux中,您有stat()系统调用:

struct stat st;
int res = stat(filename, &st);
bool exists = res == 0;

如果您想要更精细,可以查看errno res是否为非零:

if (res == 0)
    return true;
if (errno == ENOENT)
    return false;
throw errno; //you're throwing an int, aren't you?

另外,作为奖励,如果您想知道它是目录还是普通文件,还是fifo或套接字或设备......您可以查看st.st_mode的内容。

答案 1 :(得分:0)

如果您在Linux,则GCC会实施文件系统技术规范,很快就会包含在C++17中。

您可以使用std::filesystem::exists

#include <experimental/filesystem>

namespace fs = std::experimental::filesystem;

int main()
{
    if(fs::exists("/usr/bin/gedit"))
    {
        ...
        // use file here
    }
}