如何检查文件是不是存在(无论其文件类型如何)? [复制]

Posted

技术标签:

【中文标题】如何检查文件是不是存在(无论其文件类型如何)? [复制]【英文标题】:How to check if a file exists (regardless of its file type)? [duplicate]如何检查文件是否存在(无论其文件类型如何)? [复制] 【发布时间】:2017-11-05 20:51:00 【问题描述】:

编辑:问题不在于我的 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 上,我需要与上面的 sn-p 等效的可以在 Linux 上运行。

【问题讨论】:

stataccess 是可以使用的两个 POSIX 函数。或使用Boost filesystem 或即将推出的standard filesystem library。 另外,当使用 C++ 流打开文件时,系统并不关心它的“文件类型”。文件就是文件就是文件……“文本”文件只是应用程序解释内容的一种方式,流本身并不真正关心内容。 您的示例适用于"/usr/bin/gedit" “我认为它会”现在下一个合乎逻辑的步骤是验证您的假设。 顺便说一句,为什么你的函数返回 double 而不是 bool 【参考方案1】:

如果您在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
    

【讨论】:

【参考方案2】:

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

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

如果你想要更多的技巧,你可以检查errno if 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 的内容。

【讨论】:

建议你使用std::system_error,而不是直接抛出errno(例如,参见this old answer of mine)。 我通常会抛出std::runtime_error(std::strerror(errno)); 以获得有用的消息 一切都很好。我抛出 errno 只是因为 OP 直接抛出 GetLastError()

以上是关于如何检查文件是不是存在(无论其文件类型如何)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不下载的情况下使用其 URL 检查文件是不是存在?

无论数据类型如何,检查给定数据是不是为非空?

如何检查文件是不是存在于android设备的特定文件夹中

如何使用 PHP 检查远程文件是不是存在?

如何使用 PHP 检查远程文件是不是存在?

在Java Swing中保存文件时检查文件是不是存在