以下代码循环遍历“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:将“Copy of”移动到正确的位置(在文件名旁边而不是目录名称旁边)。
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);
}
}
最佳答案
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
相同)。
关于c++ - 在 C++ 中使用适当的数据类型(路径、字符串等)和 boost::filesystem 来高效地迭代文件、更改文件名和执行文件操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4272949/