如何检查文件是不是存在(无论其文件类型如何)? [复制]
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 上运行。
【问题讨论】:
stat
或 access
是可以使用的两个 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()
。以上是关于如何检查文件是不是存在(无论其文件类型如何)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章