2013-04-15 46 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) 

會在你的程序的性能幫助的簽名。