2016-12-14 5 views
2

J'ai un programme sur un système Linux qui génère des fichiers journaux de données avec des noms de fichiers prévisibles auxquels j'ai besoin d'accéder, mais je dois le faire via une interface C/C++. Le programme accès aux données doit être en mesure de prendre un chemin de fichier avec une expression régulière pour spécifier certaines plages de nom de fichier et procédez comme suit:Comment utiliser regex pour déterminer l'existence et la taille de groupes de fichiers en C/C++ sous Linux?

  • Déterminer si des fichiers correspondant à l'expression rationnelle qui existent
  • Déterminer le total taille de tous les fichiers correspondants

J'utilise ces vérifications avant de compresser et de transférer les fichiers. Comment puis-je faire cela en C/C++?

+1

Avez-vous essayé quelque chose? Ceci est mon email si vous voulez de l'aide [email protected] parce que personne ne vous donnera une réponse ici. Ce site n'est pas un service de rédaction de code mais un site d'aide. Si vous avez un problème spécifique avec votre code, vous pouvez demander ici. Sinon, si vous n'avez aucune idée de comment commencer, vous pouvez me demander en privé si vous le souhaitez. –

+1

Utiliser [std :: experimental :: filesystem] (http://en.cppreference.com/w/cpp/experimental/fs/path) Présent dans 'GCC' dès maintenant pour être inclus dans' C++ 17' . – Galik

+2

Quelle est cette langue C/C++? Il n'y a que les deux ** langages ** différents C et C++. Vous devez d'abord choisir celui que vous avez l'intention d'utiliser. – Olaf

Répondre

1

Vous pouvez faire quelque chose comme ceci:

#include <regex> 
#include <string> 
#include <experimental/filesystem> 

// make using it sane 
namespace fs = std::experimental::filesystem; 

int main(int argc, char** argv) 
{ 
    // default to current directory 
    fs::path dir = argv[1] ? argv[1] : "."; 

    fs::directory_iterator dir_ent{dir}; 
    fs::directory_iterator dir_end; 

    std::regex e{R"~(.*\.txt)~"}; 
    std::smatch m; 

    decltype(fs::file_size("")) total_size = 0; 

    for(; dir_ent != dir_end; ++dir_ent) 
    { 
     // for some reason regex_match won't accept temporaries 
     std::string s = dir_ent->path().string(); 

     if(!std::regex_match(s, m, e)) 
      continue; 

     // deal with filepath here 
     total_size += fs::file_size(dir_ent->path()); 

     // etc... 
    } 
} 
+0

Merci! Je ne savais pas sur le système de fichiers expérimental –

+0

@ AlexSt.Clair La partie "expérimentale" est de savoir si elle était prête à être incluse dans la prochaine norme, elle ne reflète pas la qualité du code. :) – Galik