21xrx.com
2024-09-20 06:11:03 Friday
登录
文章检索 我的文章 写文章
如何使用C++复制文件夹中的所有文件
2023-07-01 09:57:47 深夜i     --     --
C++ 复制文件夹 复制所有文件 文件操作 递归函数

在编程中,复制文件夹中的所有文件可以为我们的工作带来便利,这也是很多C++程序员需要学习的基本技能之一。下面介绍如何使用C++复制文件夹中的所有文件。

步骤1:引入头文件

首先,我们需要引入头文件,这将允许我们使用相关的函数,包括复制和重命名文件。


#include<iostream>

#include<fstream>

#include<cstdio>

#include<sstream>

#include<vector>

#include<cstring>

#include<dirent.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<errno.h>

步骤2:定义复制文件夹的方法

接下来,定义一个名为`copy_directory`的方法,使用递归的方式遍历复制文件夹中的所有文件和子文件夹。


bool copy_directory(const char *src, const char *dest) {

  struct stat st;

  DIR *dir = opendir(src);

  if (dir == nullptr)

    return false;

  

  if (stat(dest, &st) == -1) {

    if (mkdir(dest, 0744) == -1)

      return false;

    

  }

  while (dirent *entry = readdir(dir)) {

    if (entry->d_type == DT_DIR) {

      if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)

        continue;

      

      std::string sub_src = std::string(src) + "/" + entry->d_name;

      std::string sub_dest = std::string(dest) + "/" + entry->d_name;

      if (!copy_directory(sub_src.c_str(), sub_dest.c_str()))

        return false;

      

    } else {

      std::string sub_src = std::string(src) + "/" + entry->d_name;

      std::string sub_dest = std::string(dest) + "/" + entry->d_name;

      if (!copy_file(sub_src.c_str(), sub_dest.c_str()))

        return false;

      

    }

  }

  closedir(dir);

  return true;

}

`copy_directory`方法用到了两个辅助方法,`copy_file`和`get_file_contents`,其中`copy_file`方法用于复制单个文件,而`get_file_contents`方法则用于读取文件内容。

步骤3:实现`copy_file`方法


bool copy_file(const char *src, const char *dest) {

  std::ifstream in(src, std::ios::binary);

  std::ofstream out(dest, std::ios::binary);

  if (!in || !out)

    return false;

  

  out << in.rdbuf();

  return true;

}

`copy_file`方法将源文件的内容写入目标文件中。其中`in`流和`out`流分别用于打开源文件和目标文件。如果打开操作失败,则返回false。

步骤4:实现`get_file_contents`方法


std::string get_file_contents(const char *filename) {

  std::ifstream in(filename, std::ios::in | std::ios::binary);

  if (in) {

    std::ostringstream contents;

    contents << in.rdbuf();

    in.close();

    return contents.str();

  }

  throw(errno);

}

`get_file_contents`方法读取文件内容,并返回一个`std::string`对象。其中,`in`流用于打开要读取的文件。如果打开操作失败,则抛出异常。否则,`in.rdbuf()`读取文件内容,`std::ostringstream`将内容写入输出流。最后,返回`std::string`对象。

使用上述步骤中的代码,可以轻松复制文件夹中的所有文件。需要注意的是,这里使用C++17语言特性,需要在编译时添加`-std=c++17`参数。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复