在Unix系统下递归复制目录的C++代码

3

目前没有任何可以在c++不使用额外库的情况下直接使用的函数示例,用于将递归文件和文件夹复制到新位置。

一些替代system("cp -R -f dir");调用的方法。

我只找到了这个C语言递归目录拷贝的示例,但它还没有准备好使用,而且我也不确定这个示例是否正确。

也许有人在磁盘上有可用的示例?


因为它取决于操作系统,不是吗? - Pierre
5
目前使用boost::filesystem库。一旦C++17发布,就使用std::filesystem库。 - Richard Hodges
谁投了“-1”的票?你真的认为每个开发者都必须重新发明轮子吗? - abrahab
@RichardHodges,尽管有一种普遍的观点认为,boost::filesystem任何系统上都能运行,但事实并非如此。它只能在Windows和Posix系统上运行。 - SergeyA
1
@SergeyA 那几乎涵盖了支持目录概念的所有内容,不是吗? - Richard Hodges
显示剩余9条评论
2个回答

3
这是一个使用 POSIX 和标准库函数进行递归复制的完整示例。
#include <string>
#include <fstream>

#include <ftw.h>
#include <sys/stat.h>

const char* src_root ="foo/";
std::string dst_root ="foo2/";
constexpr int ftw_max_fd = 20; // I don't know appropriate value for this

extern "C" int copy_file(const char*, const struct stat, int);

int copy_file(const char* src_path, const struct stat* sb, int typeflag) {
    std::string dst_path = dst_root + src_path;
    switch(typeflag) {
    case FTW_D:
        mkdir(dst_path.c_str(), sb->st_mode);
        break;
    case FTW_F:
        std::ifstream  src(src_path, std::ios::binary);
        std::ofstream  dst(dst_path, std::ios::binary);
        dst << src.rdbuf();
    }
    return 0;
}

int main() {
    ftw(src_root, copy_file, ftw_max_fd);
}

请注意,使用标准库进行的简单文件复制不会复制源文件的模式。它还会深度复制链接。可能还会忽略我没有提到的一些细节。如果您需要以不同方式处理这些内容,请使用POSIX特定函数。
我建议使用Boost,因为它可以在非POSIX系统上使用,并且因为新的C ++标准文件系统API将基于它。

谢谢!我会尽快测试它。当标准具有文件系统 API 时,也许我会迁移到它。 :-) 现在,我已经在我的 Utils.h 中使用了您示例中的所有头文件,除了 ftw.h。因此,只需要添加一个包含即可,这就像可以添加的一样简单),而且我不需要可移植性 :) - abrahab
给所有将使用此函数的SO成员一个小提示。在执行该函数之前,dst_root必须已经存在于磁盘上。 - abrahab

2

Boost是如何在没有OS调用的情况下实现这一点的?也许Boost使用了POSIX库或类似的东西? - abrahab
@abrahab Boost是开源的,因此您可以查看它们的源代码以确定它们如何在POSIX系统上实现。 - callyalater
2
@abrahab Boost 在编译时检测目标系统并选择适合该系统的正确代码。 - Richard Hodges
@abrahab 了解更多关于 Boost 的内容。它非常著名,其中许多功能已被纳入 C++ 标准。Boost 文件系统也是如此,正如其他答案中所述,它已被包含在 C++ TR2 中,因此可能会成为未来 C++ 标准的一部分,这样你就可以进行跨平台目录遍历。 - phuclv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接