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

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

Marsh Posté le 29-02-2004 à 15:10:08    

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
Reply

Marsh Posté le 29-02-2004 à 15:10:08   

Reply

Marsh Posté le 29-02-2004 à 15:26:11    

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

Reply

Marsh Posté le 29-02-2004 à 15:39:10    

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

Reply

Marsh Posté le 29-02-2004 à 16:51:05    

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. }

Reply

Marsh Posté le 01-03-2004 à 02:40:53    

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
Reply

Marsh Posté le 01-03-2004 à 03:37:12    

et ouais, joce feature :D

Reply

Marsh Posté le 01-03-2004 à 12:29:34    

Ehe :)

Reply

Marsh Posté le 01-03-2004 à 12:32:14    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed