【问题标题】:C++ Copy directory recursive under unixc++ unix下递归复制目录
【发布时间】:2016-04-05 13:41:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 因为它取决于操作系统,不是吗?
  • @Pierre 我不梦想便携式解决方案。只有 Unix 系统,可能有 posix。
  • 现在,boost::filesystem。一旦 c++17 出来,std::filesystem.
  • 谁投票给“-1”?你真的认为每个开发者都必须重新发明自行车吗?
  • @SergeyA 几乎涵盖了任何支持目录概念的东西,不是吗?

标签: c++ unix recursion posix cp


【解决方案1】:

这是使用 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 时,也许,我会迁移到它。 :-) 现在,除了ftw.h 之外,我已经在我的Utils.h 中使用了您示例中的所有标头。因此,只需添加一个包含就很容易了),而且我不需要可移植性:)
  • 给所有将使用此功能的 SO 成员的小提示。 dst_root 在执行函数之前必须存在于磁盘上。
【解决方案2】:

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

另请参阅此 SO 线程:

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

【讨论】:

  • 在没有操作系统调用的情况下如何提升?也许提升使用posix lib或类似的东西?
  • @abrahab Boost 是开源的,因此您可以查看他们的源代码以确定他们如何为 POSIX 系统执行此操作。
  • @abrahab boost 在编译时检测目标系统并为目标选择正确的代码。
  • @abrahab 了解有关 boost 的更多信息。它非常有名,它的许多特性都被纳入了 C++ 标准。如另一个答案中所述,C++ TR2 中包含的 boost 文件系统也是如此,因此这可能是未来的 C++ 标准,并且您将拥有跨平台目录遍历
猜你喜欢
  • 2013-02-17
  • 2015-05-18
  • 2013-11-06
  • 1970-01-01
  • 2011-07-13
  • 2016-07-28
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多