2014-01-12 6 views
5

Ich versuche, zwei Verzeichnisse zu vergleichen und zu finden, welche Dateien innerhalb unterschiedlich sind. Also benutze ich boost::filesystem::recursive_directory_iterator, um den Inhalt jedes Verzeichnisses zu den entsprechenden Vektoren hinzuzufügen. Dann sortiere ich jeden Vektor alphabetisch und beginne den Pfad zu vergleichen. Das Problem ist, es ist einschließlich der 'Basis' Weg und ich möchte nicht, dass, Beispiel:C++: Wie ignoriere ich den ersten Verzeichnispfad beim Vergleich von Pfaden in boost :: filesystem?

Version1/Vermögen/info.txt

Version2/Vermögen/info.txt

Diese Pfade vergleichen anders, aber ich möchte, dass sie dasselbe vergleichen. Um es zu verdeutlichen, überprüfe ich noch nicht einmal die Binärdateien, sondern nur den Pfadnamen. Ich würde sich wie folgt vergleichen:

/Assets/info.txt

Ich habe für ein paar Stunden durch die Boost-Dokumentation gegrast und ich bin überzeugt, es muss eine elegante Lösung für mein Problem sein . Ich weiß, dass ich das vor einiger Zeit hätte lösen können, indem ich einen Teilstring von dem bekommen würde, was ich will, aber es muss einen weniger hässlichen Weg geben.

+0

Die Teilverfahren wahrscheinlich deine beste Wette. Ich vergleiche zwei Verzeichnisbäume. –

Antwort

6

Die boost::filesystem::recursive_directory_iterator hat eine path() Eigenschaft, die Sie abfragen können. Anschließend können Sie die folgenden Zerlegungsmethoden für boost::filesystem::path verfügbar verwenden, um den Pfad manuell zu bauen vergleichen:

path root_path() const; 
path root_name() const;   // returns 0 or 1 element path 
path root_directory() const; // returns 0 or 1 element path 
path relative_path() const; 
path parent_path() const; 
path filename() const;   // returns 0 or 1 element path 
path stem() const;    // returns 0 or 1 element path 
path extension() const;   // returns 0 or 1 element path 

Zum Beispiel können Sie eine Version von Strippen der Wurzel Rollout lassen sich wie folgt:

#include <iostream> 
#include <boost/filesystem.hpp> 

boost::filesystem::path strip_root(const boost::filesystem::path& p) { 
    const boost::filesystem::path& parent_path = p.parent_path(); 
    if (parent_path.empty() || parent_path.string() == "/") 
     return boost::filesystem::path(); 
    else 
     return strip_root(parent_path)/p.filename(); 
} 

int main() { 
    std::cout << strip_root("/a") << std::endl; 
    std::cout << strip_root("https://stackoverflow.com/a/b") << std::endl; 
    std::cout << strip_root("https://stackoverflow.com/a/b/c") << std::endl; 
    std::cout << strip_root("https://stackoverflow.com/a/b.dir/c.ext") << std::endl;  
} 
// Output: 
"" 
"b" 
"b/c" 
"b.dir/c.ext"