2013-04-15 1 views
0

J'essaie de comprendre la taille d'un fichier en utilisant le code fourni et passer le résultat dans mon objet fichier. Il ne passera que dans la taille du fichier si elle est d'une certaine extension, cette fonction fonctionne parfaitement, le seul problème que je vais avoir est que la taille du fichier que le ifile.tellg() passe à -1 pour chaque taille du fichier.Déterminer la taille du fichier 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

Est-ce 'boost :: filesystem'? Ne pouvez-vous pas utiliser ['file_size'] (http://www.boost.org/doc/libs/1_53_0/libs/filesystem/doc/reference.html#file_size)? –

+0

« le seul problème que je vais avoir est que la taille du fichier que le ifile.tellg() passe ». Peut-être pourriez-vous nous dire QUEL est le problème que vous rencontrez? –

+0

Le problème est maintenant déclaré, désolé. – Tas

Répondre

0

istream :: tellg() retourne -1 si ifstream est dans l'état a échoué. fail peut être défini dans seekg() ou, plus probablement, dans le constructeur - vérifier l'état ifile après la construction pour voir si elle est réellement ouverte. Vous pourriez avoir accès refusé, des bogues dans le nom qui passe ou autre chose.

Une source d'erreur possible: ne _path.file_string() déclarations nom de fichier seulement sans chemin absolu? Si oui, le constructeur ifile pourrait vous donner un "fichier introuvable".

Sinon, la combinaison de ifile.seekg(0,std::ios_base::end); et ifile.tellg(); devrait fonctionner comme prévu sur n'importe quel fichier binaire, donnant la taille du fichier.

0

Peut-être stat serait utile (je sais que ce n'est pas standard).

Quoi qu'il en soit cela devrait être la signature de la fonction

void NonRecursiveProcess(const string &directory) 

aiderai dans l'exécution de votre programme.

Questions connexes