弄清楚文件C ++的大小

时间:2013-04-15 17:30:49

标签: c++ filesize

我试图使用提供的代码计算出文件的大小,并将结果传递给我的文件对象。它只传递文件大小,如果它是某个扩展名,这个功能完美地工作,我唯一的问题是ifile.tellg()传入的文件大小 - 每个文件大小为1。

void NonRecursiveProcess(string directory)
{
    for(directory_iterator dir_end, dir(directory); dir != dir_end; ++dir) 
    { 
        path _path(*dir); 
        if(!is_directory(_path)) 
        { 
            for ( vector<ExtensionAbstract*>::iterator it = extensionsAbstract.begin() ; it != extensionsAbstract.end(); ++it)
            {
                if ( _path.file_string().substr(_path.file_string().find_last_of(".") + 1) == (*it)->GetExtension())
                {
                    std::ifstream ifile(_path.file_string(), std::ifstream::in | std::ifstream::binary );
                    ifile.seekg(0, std::ios_base::end);
                    (*it)->AddkB(ifile.tellg());
                    (*it)->AddFileCount();
                }
            }
        } 
    } 
}`

2 个答案:

答案 0 :(得分:0)

也许stat会有用(我知道它不是标准的)。

无论如何,这应该是功能的签名

void NonRecursiveProcess(const string &directory)

将有助于您的计划的表现。

答案 1 :(得分:0)

如果ifstream处于失败状态,则

istream :: tellg()返回-1。 fail可以在seekg()中设置,或者更可能在构造函数中设置 - 在构造之后检查ifile状态以查看它是否实际打开。您可以获得访问被拒绝,名称传递中的错误或其他内容。

一个可能的错误来源:不是_path.file_string()只返回没有绝对路径的文件名吗?如果是这样,ifile构造函数可以给你“找不到文件”。

否则,ifile.seekg(0,std::ios_base::end);ifile.tellg();的组合应该在任何二进制文件上按预期工作,给出文件大小。