2010-12-10 10 views
1

Je suis Noob à C + + Boost. Quelqu'un peut-il m'aider à déboguer ce programme.Aidez-moi à déboguer ce - C++ Boost

#include <iostream> 
#include <boost/filesystem/operations.hpp> 
#include <boost/filesystem/fstream.hpp> 
using namespace boost::filesystem; 
using namespace std; 

void show_files(const path & directory, bool recurse_into_subdirs = true) 
{ 
    if(exists(directory)) 
    { 
    directory_iterator end ; 
    for(directory_iterator iter(directory) ; iter != end ; ++iter) 
     if (is_directory(*iter)) 
     { 
     cout << iter->native_directory_string() << " (directory)\n" ; 
     if(recurse_into_subdirs) show_files(*iter) ; 
     } 
     else 
     cout << iter->native_file_string() << " (file)\n" ; 
    } 
} 

int main() 
{ 
    show_files(".") ; 
} 

Wen Je suis en train de lancer ce programme, je reçois erreur comme

ex2.cpp: In function ‘void show_files(const boost::filesystem2::path&, bool)’: 
ex2.cpp:15: error: ‘class boost::filesystem2::basic_directory_entry<boost::filesystem2::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem2::path_traits> >’ has no member named ‘native_directory_string’ 
ex2.cpp:19: error: ‘class boost::filesystem2::basic_directory_entry<boost::filesystem2::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem2::path_traits> >’ has no member named ‘native_file_string’ 

Tanx à l'avance. P.S. Ce programme va lister tous les fichiers/dossiers

Répondre

4

Il y a deux changements que vous devez faire pour obtenir ce travail correctement. Tout d'abord, l'itérateur renvoie une instance de basic_directory_entry, pas un chemin. Donc, vous devez d'abord interroger le path à partir de l'itérateur. En outre, les nouvelles versions de boost ont supprimé le préfixe native_ des méthodes d'accès.

Voici votre code avec les changements:

#include <iostream> 
#include <boost/filesystem/operations.hpp> 
#include <boost/filesystem/fstream.hpp> 
using namespace boost::filesystem; 
using namespace std; 

void show_files(const path & directory, bool recurse_into_subdirs = true) 
{ 
    if(exists(directory)) 
    { 
    directory_iterator end ; 
    for(directory_iterator iter(directory) ; iter != end ; ++iter) 
    if (is_directory(*iter)) 
    { 
     cout << iter->path().directory_string() << " (directory)\n" ; 
     if(recurse_into_subdirs) show_files(*iter) ; 
    } 
    else 
     cout << iter->path().file_string() << " (file)\n" ; 
    } 
} 

int main() 
{ 
    show_files(".") ; 
} 
+0

J'ai essayé code ci-dessus. Mais c'est donner beaucoup d'erreur. BTW tanx pour votre réponse – Allwyn

+0

Cela compile et fonctionne parfaitement sur ma machine (OS X avec Boost 1.44). Les seuls changements de votre code I détaillés ci-dessus. Quelles sont les erreurs que vous obtenez? Le problème peut être causé par le passage de v2 à v3 dans l'API du système de fichiers Boost, ce qui entraîne un grand nombre de changements d'interface. Si vous me dites la version que vous utilisez, je suis sûr que nous pouvons y arriver. – gavinb

+0

J'utilise 1,45. – Allwyn

1

J'ai eu un coup d'oeil rapide à la documentation et je ne trouve aucune mention de native_directory_string ou native_file_string contre basic_directory_entry. , Appartiennent ces fonctions membres AFAICT à une autre classe (filesystem::path), que je pense que vous pouvez accéder à partir basic_directory_entry ainsi:

iter->path().native_directory_string() 
4

Puisque je ne peux pas ajouter simplement un commentaire à la (actuellement) réponse haut, je voudrais prendre note de

boost :: système de fichiers :: wpath :: native_file_string() étant obsolète et changé en boost :: filesystem :: wpath :: string(). Ainsi, la ligne suivante

cout << iter->native_file_string() << " (file)\n" ; 

devient

cout << iter->string() << " (file)\n" ;