Использование соответствующих типов данных (путь, строка и т. Д.) С boost :: filesystem в C ++ для эффективной итерации файлов, изменения имен файлов и выполнения файловых операций - PullRequest
3 голосов
/ 25 ноября 2010

Следующий код просматривает файлы в «sourcepath» и копирует их в «destpath». Если они существуют, они переименовываются в «Копию» исходного имени файла.

Мне действительно нужно много кода для этого? У меня такое ощущение, что я слишком много назад и вперед преобразую между строками и путями, но я не уверен, как еще это сделать.

Есть ли менее сложный и более эффективный способ сделать это, или это так хорошо, как это получается?

Система: Win32 (XP), библиотеки Boost: 1,44 v2, среда разработки: 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: перемещена «Копия» в нужное место (рядом с именем файла, а не именем dir).

ETA2: Рефакторинг с использованием предложенных изменений:

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

1 Ответ

4 голосов
/ 25 ноября 2010

path объекты имеют перегруженный оператор /, который добавляет второй путь с разделителем в путь.

Ваш

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

может быть записан как

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

(То же самое с pathNewDestFilename).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...