Следующий код просматривает файлы в «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);
}
}