如何检查文件是否存在并且在C ++中是否可读?

时间:2009-09-05 15:38:00

标签: c++ linux file fstream exists

我有一个fstream my_file(“test.txt”),但我不知道test.txt是否存在。如果它存在,我想知道我是否也可以阅读它。怎么做?

我使用Linux。

8 个答案:

答案 0 :(得分:82)

我可能会选择:

ifstream my_file("test.txt");
if (my_file.good())
{
  // read away
}

good方法检查流是否可以从中读取。

答案 1 :(得分:22)

您可以使用Boost.Filesystem。它有一个boost::filesystem::exist函数。

我不知道如何检查读访问权限。你也可以查看Boost.Filesystem。然而,除了尝试实际读取文件之外,没有其他(便携式)方式。

答案 2 :(得分:11)

什么操作系统/平台?

在Linux / Unix / MacOSX上,您可以使用fstat

在Windows上,您可以使用GetFileAttributes

通常,使用标准C / C ++ IO函数没有可移植的方法。

答案 3 :(得分:10)

如果您使用的是unix,那么access()可以告诉您它是否可读。但是如果正在使用ACL,那么它会变得更复杂,在这种情况下,最好只用ifstream打开文件并尝试读取..如果你不能读取,那么ACL可能会禁止阅读。

答案 4 :(得分:5)

从C ++ 11开始,可以使用隐式operator bool代替good()

ifstream my_file("test.txt");
if (my_file) {
  // read away
}

答案 5 :(得分:2)

我知道这张海报最终说他们使用的是Linux,但我很惊讶没有人提到Windows的PathFileExists() API调用。

您需要包含Shlwapi.lib库和Shlwapi.h头文件。

#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>

该函数返回BOOL值,可以这样调用:

if( PathFileExists("C:\\path\\to\\your\\file.ext") )
{
    // do something
}

答案 6 :(得分:2)

C ++ 17,跨平台:使用std::filesystem::exists检查文件是否存在,使用std::filesystem::status检查文件的可读性。 std::filesystem::perms

#include <iostream>
#include <filesystem> // C++17
namespace fs = std::filesystem;

/*! \return True if owner, group and others have read permission,
            i.e. at least 0444.
*/
bool IsReadable(const fs::path& p)
{
    std::error_code ec; // For noexcept overload usage.
    auto perms = fs::status(p, ec).permissions();
    if ((perms & fs::perms::owner_read) != fs::perms::none &&
        (perms & fs::perms::group_read) != fs::perms::none &&
        (perms & fs::perms::others_read) != fs::perms::none
        )
    {
        return true;
    }
    return false;
}

int main()
{
    fs::path filePath("path/to/test.txt");
    std::error_code ec; // For noexcept overload usage.
    if (fs::exists(filePath, ec) && !ec)
    {
        if (IsReadable(filePath))
        {
            std::cout << filePath << " exists and is readable.";
        }
    }
}

还要考虑检查file type

答案 7 :(得分:0)

关于在windows中使用fstat,我不确定它是否是你想要的。从Microsoft开始,该文件必须已打开。 Stat应该适合你。