// Recursively copies those files and folders from src to target which matches
// predicate, and overwrites existing files in target.
void CopyRecursive(const fs::path& src, const fs::path& target,
const std::function<bool(fs::path)>& predicate /* or use template */) noexcept
{
try
{
for (const auto& dirEntry : fs::recursive_directory_iterator(src))
{
const auto& p = dirEntry.path();
if (predicate(p))
{
// Create path in target, if not existing.
const auto relativeSrc = fs::relative(p, src);
const auto targetParentPath = target / relativeSrc.parent_path();
fs::create_directories(targetParentPath);
// Copy to the targetParentPath which we just created.
fs::copy(p, targetParentPath, fs::copy_options::overwrite_existing);
}
}
}
catch (std::exception& e)
{
std::cout << e.what();
}
}
当调用第二个方法(如
#include <filesystem>
#include <iostream>
#include <functional>
namespace fs = std::filesystem;
int main()
{
const auto root = fs::current_path();
const auto src = root / "src";
const auto target = root / "target";
// Copy only those files which contain "Sub" in their stem.
const auto filter = [](const fs::path& p) -> bool
{
return p.stem().generic_string().find("Sub") != std::string::npos;
};
CopyRecursive(src, target, filter);
}
2条答案
按热度按时间kcwpcxri1#
是的,可以复制完整的目录结构只使用std C++...从C++17开始及其
std::filesystem
,其中包括std::filesystem::copy
。1.可以使用
copy_options::recursive
复制所有文件:1.要使用过滤器复制某个文件子集,可以使用
recursive_directory_iterator
:当调用第二个方法(如
并且给定的文件系统位于进程的工作目录中,则结果为
您还可以将
copy_options
作为参数传递给CopyRecursive()
,以获得更大的灵活性。上面使用的
std::filesystem
中的一些函数列表:relative()
减去路径并注意符号链接(它使用path::lexically_relative()
和weakly_canonical()
)create_directories()
为给定路径中尚不存在的每个元素创建一个目录current_path()
返回(或更改)当前工作目录的绝对路径path::stem()
返回不带最终扩展名的文件名path::generic_string()
给出带有独立于平台的目录分隔符/
的窄字符串对于生产代码,我建议将错误处理从实用程序函数中提取出来。对于错误处理,
std::filesystem
提供了两种方法:std::exception
/std::filesystem::filesystem_error
异常1.错误代码为
std::error_code
。还应考虑
std::filesystem
可能是not be available on all platforms**如果实现无法访问分层文件系统,或者如果它不提供必要的功能,则文件系统库工具可能不可用。**如果底层文件系统不支持某些功能,则它们可能不可用(例如:FAT文件系统缺少符号链接并禁止多个硬链接)。在这些情况下,必须报告错误。
1tu0hz3e2#
Roi Danton的方法是最好的,但考虑到
std::filesystem
可能是not be available on all platforms。也许这是一种替代方法。