返回没有读取权限的大小文件c ++

时间:2016-06-06 19:29:04

标签: c++

我正在使用这段代码

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

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

3 个答案:

答案 0 :(得分:3)

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

将来,当c ++ 17发布时,c ++标准库将具有an API for basic file system operations。使用该API,这不应该要求对文件的读取权限(当然,您确实需要路径中所有父目录的权限),但是,我不认为该标准提供了关于不需要权限的任何保证:

return std::filesystem::file_size(filename);

在您的标准库支持即将推出的标准之前(某些标准库已经拥有experimental/filesystem technical specification的实验支持),您需要求助于OS specific APIa non-standard wrapper library

答案 1 :(得分:1)

好吧,如果没有读取权限,您的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合规性)(当然,您需要访问权限才能读取目录内容信息)。

答案 2 :(得分:1)

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

要点:

#include <sys/stat.h>

int stat(const char *restrict path, struct stat *restrict buf);

因此,您声明一个 stat 结构来保存结果,并将指针传递给stat:

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相关联(请参阅experimental::filesystem linker error)。