2013-04-15 31 views
0

我想使用提供的代码找出文件的大小并将结果传递到我的文件对象中。它只会传递文件大小,如果它是一个特定的扩展名,这个函数完美工作,我唯一的问题是ifile.tellg()传递-1的文件大小为每个文件大小。找出文件的大小C++

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(); 
       } 
      } 
     } 
    } 
}` 
+1

这是'boost :: filesystem'吗?你不能只使用['file_size'](http://www.boost.org/doc/libs/1_53_0/libs/filesystem/doc/reference.html#file_size)吗? –

+0

“我遇到的唯一问题是ifile.tellg()传递的文件大小”。也许你可以告诉我们你遇到的问题是什么? –

+0

问题现在说,对不起。 – Tas

回答

0

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

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

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

0

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

反正这应该是功能

void NonRecursiveProcess(const string &directory) 

会在你的程序的性能帮助的签名。