66

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

我使用 Linux。

4

8 回答 8

87

我可能会选择:

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

good方法检查流是否准备好被读取。

于 2009-09-05T15:44:14.677 回答
22

您可能会使用Boost.Filesystem。它有一个boost::filesystem::exist功能。

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

编辑(2021-08-26):引入了 C++17 <filesystem>,你有std::filesystem::exists. 为此不再需要升压。

于 2009-09-05T16:04:54.713 回答
11

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

于 2009-09-05T15:47:28.453 回答
10

什么操作系统/平台?

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

在 Windows 上,您可以使用GetFileAttributes

通常,使用标准 C/C++ IO 函数没有可移植的方式来执行此操作。

于 2009-09-05T15:43:12.270 回答
10

C++17,跨平台:使用&检查文件是否存在std::filesystem::exists和可读性:std::filesystem::statusstd::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.";
        }
    }
}

还要考虑检查文件类型

于 2018-06-18T16:51:18.007 回答
6

从 C++11 开始,可以使用隐式运算符 bool而不是good()

ifstream my_file("test.txt");
if (my_file) {
  // read away
}
于 2016-08-05T07:22:25.917 回答
2

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

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

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

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

if( PathFileExists("C:\\path\\to\\your\\file.ext") )
{
    // do something
}
于 2012-08-14T19:11:09.003 回答
0

关于在 Windows 中使用 fstat,我不确定它是否是您想要的。来自Microsoft的文件必须已经打开。统计应该为你工作。

于 2012-06-28T10:23:41.087 回答