Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2009 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] boost::filesystem > Chemins relatifs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] boost::filesystem > Chemins relatifs

n°659339
Evadream -​jbd-
Posté le 29-02-2004 à 15:10:08  profilanswer
 

Bonjour tout le monde,
 
Je suis en train d'explorer la bibliothèque boost, et notamment tout ce qui concerne la partie "filesystem". Je me demandais si il y avait un moyen simple d'obtenir le chemin relatif d'un élément (fichier ou dossier) à partir d'un chemin donné.
 
Par exemple, en reprenant les exemples fournis, voici un ls récursif :
 

Code :
  1. bool ls_rec( const fs::path &dir_path ) {
  2.   if ( !fs::exists( dir_path ) ) return false;
  3.  
  4.    fs::directory_iterator end_itr;
  5.  
  6.     for ( fs::directory_iterator itr( dir_path ); itr != end_itr; ++itr )  {
  7.     if ( fs::is_directory( *itr ) ) {
  8.   std::cout << "Repertoire " << itr->relative_path().string() <<  std::endl ;
  9.   ls_rec( *itr ) ;
  10.      }
  11.         else  {
  12.   std::cout << "Fichier : "  << itr->relative_path().string() <<  std::endl ;
  13.     }
  14.   }
  15.  
  16.   return true ;
  17. }
  18. int main( int argc, char* argv[] )
  19. {
  20.   fs::path full_path( fs::initial_path() ) ;
  21.   if ( argc > 1 )
  22.     full_path = fs::system_complete( fs::path( argv[1], fs::native ) );
  23.    
  24.   ls_rec(full_path) ;
  25. }


 
Cela m'affiche à chaque fois le chemin complet pour chaque fichier/dossier. J'aimerais pouvoir afficher le chemin relatif au chemin initial, par exemple.
 
Est-ce possible "directement" avec les fonctionnalitées offertes par boost::filesystem ? J'ai parcouru la doc, mais j'ai peut-être mal interprété quelque chose.  
 
Merci à tous, @+


Message édité par Evadream -jbd- le 29-02-2004 à 15:33:13
mood
Publicité
Posté le 29-02-2004 à 15:10:08  profilanswer
 

n°659350
Taz
bisounours-codeur
Posté le 29-02-2004 à 15:26:11  profilanswer
 

moi non plus je vois rien qui fasse ça dans la documentation ...

n°659356
Evadream -​jbd-
Posté le 29-02-2004 à 15:39:10  profilanswer
 

Ok, merci pour ta réponse/confirmation :)

n°659373
Evadream -​jbd-
Posté le 29-02-2004 à 16:51:05  profilanswer
 

Une solution naïve :
 

Code :
  1. std::string relative_path_string(const fs::path &init_path, const fs::path &dir_path )
  2. {
  3. std::string a( init_path.relative_path().string() ) ;
  4. std::string b( dir_path.relative_path().string() ) ;
  5. b.replace(b.find(a), a.size()+1, "" ) ;
  6. return b ;
  7. }

n°659780
Evadream -​jbd-
Posté le 01-03-2004 à 02:40:53  profilanswer
 

Je poste ici la version fonctionnelle de ce que je voulais faire, bien que je ne trouve pas ma solution très élégante :
 

Code :
  1. /* on efface la partie commune à "init_path+dir_path" */ 
  2. std::string relative_path_string(const fs::path &init_path, const fs::path &dir_path )
  3. {
  4. std::string b( dir_path.relative_path().string() ) ;
  5. b.replace(
  6.             b.find( init_path.relative_path().string() ), 
  7.             init_path.relative_path().string().size()+1,
  8.             "" ) ;
  9. return b ;
  10. }
  11. bool ls_rec( const fs::path &init_path, const fs::path &dir_path ) {
  12.   if ( !fs::exists( dir_path ) ) return false;
  13.   fs::directory_iterator end_itr;
  14.  
  15.   for ( fs::directory_iterator itr( dir_path ); itr != end_itr; ++itr )  {
  16.  
  17.    try {
  18.   if ( fs::is_directory( *itr ) ) {
  19.    std::cout << relative_path_string(init_path, *itr) << " " << nb << std::endl ;
  20.    ls_rec( init_path, *itr ) ;
  21.   }
  22.   else  {
  23.    std::cout << relative_path_string(init_path, *itr) << " " << nb << std::endl ; 
  24.    }
  25.  }
  26.     catch ( const std::exception & ex ) {
  27.          std::cout << itr->leaf() << " " << ex.what() << std::endl;
  28.        }
  29.   }
  30.  
  31.   return true ;
  32. }
  33. int main( int argc, char* argv[] )
  34. {
  35.   fs::path full_path( fs::initial_path() ) ;
  36.   if ( argc > 1 )
  37.     full_path = fs::system_complete( fs::path( argv[1], fs::native ) );
  38.    
  39.   ls_rec(full_path, full_path) ; 
  40.  
  41. }


 
Voilà, si vous avez des commentaires/suggestions, n'hésitez surtout pas !
 
@+ tout le monde, et bonne nuit.
 
Edit : tiens c'est rigolo, je ne mets pas de majuscules à  

fs::directory_iterator


et pourtant, il m'en met une :)


Message édité par Evadream -jbd- le 01-03-2004 à 02:48:01
n°659782
Taz
bisounours-codeur
Posté le 01-03-2004 à 03:37:12  profilanswer
 

et ouais, joce feature :D

n°659971
Evadream -​jbd-
Posté le 01-03-2004 à 12:29:34  profilanswer
 

Ehe :)

n°659973
Taz
bisounours-codeur
Posté le 01-03-2004 à 12:32:14  profilanswer
 

il l'a jamais corrigé, ça fait un moment que ce problème a été remarqué, je l'avais dit à Sly, mais rien ... toute façon la coloration est miteuse, il manque des mots clef, les commentaires sont mal fait, les "chaine" 'c' et nombre pourrait être colorier eux aussi


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] boost::filesystem > Chemins relatifs

 

Sujets relatifs
[Résolu] problemes avec les chemins des images sur netscapeXML -> String et chemins de fichiers
Nb Chemins sans CircuitsTrouver le chemin relatif à partir de chemins absoluts.
[VB] pb avec scripting/filesystem sous XPalgo pour trouver tous les chemins...
[PHP/APACHE/FILESYSTEM] Limiter le nombre de fichier par rep ?[VC6] Pb d'install de la bibliothéque Boost
comment on fait des chemins relatifs ? 
Plus de sujets relatifs à : [C++] boost::filesystem > Chemins relatifs


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)