3 Stimmen

Verwendung geeigneter Datentypen (Pfad, String usw.) mit boost::filesystem in C++, um Dateien effizient zu iterieren, Dateinamen zu ändern und Dateioperationen durchzuführen

Der folgende Code durchläuft die Dateien in "sourcepath" und kopiert sie nach "destpath". Wenn sie vorhanden sind, werden sie in "Kopie von" des ursprünglichen Dateinamens umbenannt.

Brauche ich dafür wirklich so viel Code? Ich habe das Gefühl, dass ich viel zu viel hin und her zwischen Strings und Pfaden konvertieren, aber ich bin nicht sicher, wie es sonst zu tun.

Gibt es eine unkompliziertere und effizientere Möglichkeit, dies zu tun, oder ist dies das Beste, was es gibt?

System: Win32(XP), Boost-Bibliotheken: 1.44 v2, Entwicklungsumgebung: Visual Studio TS 2008

namespace bfs = boost::filesystem;

bfs::path pathSource("C:/dir/sourcepath");
bfs::path pathDest("C:/dir/destpath");

for (bfs::directory_iterator iterDir(pathSource); 
    iterDir!=bfs::directory_iterator(); iterDir++)
{
    std::string strSourceFilename(pathSource.string() + "/" 
        + iterDir->filename());
    std::string strDestFilename(pathDest.string() + "/" 
        + iterDir->filename());
    bfs::path pathSourceFilename(strSourceFilename);
    bfs::path pathDestFilename(strDestFilename);

    if(!bfs::exists(pathDestFilename))
        bfs::copy_file(pathSourceFilename, pathDestFilename);
    else {
        std::string strNewDestFilename(pathDest.string() 
            + "/" + "Copy of " + iterDir->filename());
        bfs::path pathNewDestFilename(strNewDestFilename);
        bfs::copy_file(pathSourceFilename, pathNewDestFilename);
    }
}

ETA: Ich habe "Kopie von" an die richtige Stelle verschoben (neben den Dateinamen, nicht den Verzeichnisnamen).

ETA2: Mit den vorgeschlagenen Änderungen umgestaltet:

namespace bfs = boost::filesystem;

bfs::path pathSource("C:/dir/sourcepath");
bfs::path pathDest("C:/dir/destpath");

for (bfs::directory_iterator iterDir(pathSource); 
    iterDir!=bfs::directory_iterator(); iterDir++)
{
    bfs::path pathSourceFilename(pathSource / iterDir->filename());
    bfs::path pathDestFilename(pathDest / iterDir->filename());

    if(!bfs::exists(pathDestFilename))
        bfs::copy_file(pathSourceFilename, pathDestFilename);
    else {
        std::string strNewDestFilename("Copy of " + iterDir->filename());
        bfs::path pathNewDestFilename(pathDest / strNewDestFilename);
        bfs::copy_file(pathSourceFilename, pathNewDestFilename);
    }
}

4voto

Cat Plus Plus Punkte 119072

path Objekte haben überladene / Operator, der den zweiten Operanden mit einem Trennzeichen an den Pfad anhängt.

Ihr

std::string strSourceFilename(pathSource.string() + "/" 
    + iterDir->filename());
std::string strDestFilename(pathDest.string() + "/" 
    + iterDir->filename());
bfs::path pathSourceFilename(strSourceFilename);
bfs::path pathDestFilename(strDestFilename);

kann geschrieben werden als

bfs::path pathSourceFilename(pathSource / iterDir->filename());
bfs::path pathDestFilename(pathDest / iterDir->filename());

(Dasselbe gilt für pathNewDestFilename ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X