c++ - 在 C++ 中使用适当的数据类型(路径、字符串等)和 boost::filesystem 来高效地迭代文件、更改文件名和执行文件操作

标签 c++ boost

以下代码循环遍历“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/

相关文章:

c++ - 错误 : invalid use of non-static data member in CPP

c++ - 拆分搜索短语的正则表达式

c++ - 动态生成和安全使用spsc_queues

c++ - 使用捆绑属性时 BGL 中的不完整类型错误

c++ - 为什么 Boost 库会返回 "convertible to ` bool `"rather than just returning ` bool`s?

c++ - 将 std::vector<boost::shared_ptr<T>> 转换为 std::vector<T*> 的优雅解决方案

.net - ASP.NET 是否支持 C++?

c++ - 如何使用 std::optional<T>::emplace 的第二个重载

c++ - std::string 赋值时出现段错误

c++ - 条件变量的 "wait"函数在提供谓词时导致意外行为