How can I copy a directory using Boost Filesystem

后端 未结 4 1757
栀梦
栀梦 2020-12-08 14:40

How can I copy a directory using Boost Filesystem? I have tried boost::filesystem::copy_directory() but that only creates the target directory and does not copy the contents

4条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-08 14:58

    I see this version as an improved upon version of @nijansen's answer. It also supports the source and/or destination directories to be relative.

    namespace fs = boost::filesystem;
    
    void copyDirectoryRecursively(const fs::path& sourceDir, const fs::path& destinationDir)
    {
        if (!fs::exists(sourceDir) || !fs::is_directory(sourceDir))
        {
            throw std::runtime_error("Source directory " + sourceDir.string() + " does not exist or is not a directory");
        }
        if (fs::exists(destinationDir))
        {
            throw std::runtime_error("Destination directory " + destinationDir.string() + " already exists");
        }
        if (!fs::create_directory(destinationDir))
        {
            throw std::runtime_error("Cannot create destination directory " + destinationDir.string());
        }
    
        for (const auto& dirEnt : fs::recursive_directory_iterator{sourceDir})
        {
            const auto& path = dirEnt.path();
            auto relativePathStr = path.string();
            boost::replace_first(relativePathStr, sourceDir.string(), "");
            fs::copy(path, destinationDir / relativePathStr);
        }
    }
    

    The main differences are exceptions instead of return values, the use of recursive_directory_iterator and boost::replace_first to strip the common part of the iterator path, and relying on boost::filesystem::copy() to do the right thing with different file types (preserving symlinks, for instance).

提交回复
热议问题