在没有读取权限 c++ 的情况下返回大小文件



我正在使用这段代码

long filesize (const char * filename)
{
    ifstream file (filename, ios::in|ios::binary);
    file.seekg (0, ios::end);
    return file.tellg();
}

为了返回以字节为单位的文件大小。但是,没有读取权限的文件会导致返回 -1。有没有办法使用 c++ 或 c 返回文件和目录的大小,即使在没有读取权限的情况下也可以在文件上运行?我正在寻找一段时间,但未能找到可靠的解决方案。

当前的 c++ 标准库不提供从文件系统查询文件大小的可能性。

将来,当 c++17 发布时,c++ 标准库将具有用于基本文件系统操作的 API。使用该 API,这应该不需要对文件的读取权限(但当然,您确实需要对路径中的所有父目录的权限),尽管我认为该标准没有提供任何关于不需要权限的保证:

return std::filesystem::file_size(filename);
在您的标准库支持

即将推出的标准之前(某些标准库已经对实验/文件系统技术规范提供了实验性支持),您将需要求助于特定于操作系统的 API 或非标准包装库。

好吧,如果没有读取权限,您的file将处于错误状态,调用file.seekg()也会导致错误状态:

long filesize (const char * filename)
{
    ifstream file (filename, ios::in|ios::binary);
    if(file) { // Check if opening file was successful
        file.seekg (0, ios::end);
        return file.tellg();
    }
    return -1; // <<<< Indicate that an error occured
}

如果文件不允许您打开它,您仍然可以使用 stat() 检查目录结构并获取有关文件的信息。但这依赖于平台(POSIX 合规性)(当然,您需要访问权限才能读取目录内容信息)。

在 POSIX 系统上,您可以使用 stat。

总结:

#include <sys/stat.h>
int stat(const char *restrict path, struct stat *restrict buf);

因此,您声明一个统计信息结构来保存结果,并将指针传递给统计信息

struct stat buf;
stat(filename, &buf);

大小(以字节为单位)包含在 buf.st_size 中。

如果你的标准库实现包含<experimental/filesystem>(它应该来自 C++17 的实验),你可以改用它。 #include <experimental/filesystem> ,然后使用 std::experimental::filesystem::file_size(filename) 代替 filesize 函数。(这也返回以字节为单位的大小。它只是在 POSIX 系统上调用 stat 函数。

对于 GCC,您需要与 -lstdc++fs 链接(请参阅实验::文件系统链接器错误)。

相关内容

最新更新