2010-12-10 13 views
1

Ich bin noob zu C++ Boost. Kann mir hier jemand helfen, dieses Programm zu debuggen?Hilf mir dabei zu debuggen - 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 ich versuche, dieses Programm auszuführen, ich bin immer Fehler wie

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 im Voraus. P.S. Dieses Programm listet alle Dateien/Ordner auf

Antwort

4

Es gibt zwei Änderungen, die Sie richtig diese Arbeit zu bekommen vornehmen müssen. Zunächst gibt der Iterator eine Instanz basic_directory_entry zurück, keinen Pfad. Zuerst müssen Sie die path vom Iterator abfragen. Außerdem haben neuere Boost-Versionen das native_-Präfix von den Accessor-Methoden entfernt.

Hier ist der Code mit den Änderungen:

#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

ich oben Code versucht. Aber es gibt viel Fehler. BTW Tanx für Ihre Antwort – Allwyn

+0

Dies kompiliert und läuft perfekt auf meinem Rechner (OS X mit Boost 1.44). Die einzigen Änderungen von Ihrem Code, den ich oben beschrieben habe. Was sind die Fehler, die Sie bekommen? Das Problem kann durch den Wechsel von v2 zu v3 in der Boost-Dateisystem-API verursacht werden, die eine große Anzahl von Schnittstellenänderungen bewirkt. Wenn Sie mir die Version sagen, die Sie verwenden, können wir das sicher lösen. – gavinb

+0

Ich benutze 1.45. – Allwyn

1

Ich hatte einen kurzen Blick auf die Dokumentation und ich kann keine Erwähnung von native_directory_string oder native_file_string gegen basic_directory_entry finden. AFAICT gehören diese Member-Funktionen in eine andere Klasse (filesystem::path), die ich glaube, Sie von basic_directory_entry so zugreifen:

iter->path().native_directory_string() 
4

Da kann ich einfach nicht einen Kommentar zu der (derzeit) Top-Antwort hinzufügen, würde Ich mag zur Kenntnis

boost :: filesystem machen :: wpath :: native_file_string() wird veraltet und in boost :: filesystem :: wpath :: string() geändert. So ist die folgende Zeile

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

wird

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