C ++复制目录在unix下递归

时间:2016-04-05 13:41:52

标签: c++ unix recursion posix cp

c++ without additional libs上没有任何准备使用的函数示例将递归文件和文件夹复制到新位置。

system("cp -R -f dir");来电的替代方案。

我在线程答案中只找到了这个Recursive directory copying in C示例,但它还没有准备好使用,我不确定这个例子是否正确。

也许有人在磁盘上有工作示例?

2 个答案:

答案 0 :(得分: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将基于它。

答案 1 :(得分:2)

标准C ++没有目录的概念,只有文件。对于你想做的事,你应该只使用Boost Filesystem。值得了解。否则,您可以从C ++应用程序进行依赖于操作系统的调用。

另见这个SO线程:

How do you iterate through every file/directory recursively in standard C++?