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

标签 c++ linux

<分区>

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

我正在尝试检测文件是否存在,我已经在 Internet 上尝试了很多方法,但似乎都不起作用。这是一个例子:

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 上运行。

最佳答案

在 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

关于c++ - 如何检查文件是否存在(无论其文件类型如何)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44362873/

相关文章:

linux - libevent 的实现细节是什么?轮询机制的封装?

linux - 附加了 '~' 的 Debian 重复文件

linux - DNS 命名无法重新启动

linux - 计算给定分区的已用磁盘空间百分比的 bash 脚本

c++ - Qt Sqlite 表列似乎不见了

c++ - 在线程退出时通知服务员

c++ - 使用 QWidget::render() 绘制绘制其他小部件的小部件(自定义 paintEvent)

C++ - 将 2 个字符数组元素转换为 short int

c++ - 按值传递然后移动构造还是按引用传递然后复制构造更好

c++ - 如何使用 C/C++ 通过 system() 系统调用以外的其他方法获取 Linux 中的文件功能?