2010-11-25 2 views
3

Der folgende Code durchläuft Dateien in "Quellpfad" und kopiert sie nach "destpath ". Wenn sie vorhanden sind, werden sie als "Kopie von" dem ursprünglichen Dateinamen umbenannt.Verwenden geeigneter Datentypen (Pfad, Zeichenfolge usw.) mit boost :: Dateisystem in C++ zum effizienten Iterieren, Ändern von Dateinamen und Ausführen von Dateioperationen

Benötige ich wirklich so viel Code dafür? Ich habe das Gefühl, dass ich viel zu viel hin und her zwischen Strings und Pfaden konvertiere, aber ich bin mir nicht sicher, wie ich das sonst tun soll.

Gibt es einen weniger komplizierten und effizienteren Weg dies zu tun, oder ist das so gut wie es geht?

System: Win32 (XP), Boost-Bibliotheken: 1,44 v2, Dev env: 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: Verschoben "Kopie von" an der richtigen Stelle (neben dem Dateinamen statt der Dir Name).

ETA2: überarbeitete vorgeschlagene Bearbeitungen unter Verwendung von:

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); 
    } 
} 

Antwort

4

path Gegenstände / Betreiber überlasteten, das den zweiten Operanden mit einem Separator zum Pfad anhängt.

Ihre

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

als

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

(Same mit pathNewDestFilename) geschrieben werden.

+0

Ich oben bearbeitet, mit einer Zeichenfolge für den neuen Dateinamen und dem Operator /, um den Pfad zu sammeln. Vielen Dank! :) – Ennael

Verwandte Themen