如何在c ++中将文件夹从一个路径复制到另一个路径

时间:2010-02-10 05:13:02

标签: c++

HI ...任何人都可以提供如何将文件夹从一个目录复制到另一个目录的代码...我可以通过此代码复制文件,但我不能一次复制entir文件夹..

    FILE *in, *out;
    char ch;
    if((in=fopen(sour->getfilepath(), "rb")) == NULL) 
    {
        printf("Cannot open input file.\n");
        getch();
        exit(1);
    }
    if((out=fopen(dest->getfilepath(), "wb")) == NULL) 
    {
        printf("Cannot open output file.\n");
        getch();
        exit(1);
    }
    while(!feof(in))
    {
        ch = getc(in);
        if(ferror(in))
        {
            printf("Read Error");
            clearerr(in);
            break;
        } 
    else
    {
        if(!feof(in)) putc(ch, out);
        if(ferror(out))
        {
            printf("Write Error");
            clearerr(out);
            break;
        }
    }
  }
  fclose(in);
  fclose(out);

6 个答案:

答案 0 :(得分:4)

如果您想使用可移植代码执行此操作,您应该考虑使用Boost文件系统库。对于稍微不那么便携,你可以使用Posix目录函数(opendir,readdir,closedir,chdir等)如果你根本不关心可移植性,你可能会有一些特定于系统的东西(例如在Windows FindFirstFile上) ,FindNextFile,FindClose,SetCurrentDirectory)。

就实际文件复制而言,您的代码在现实生活中可能无法正常工作 - 例如,您通常不会在尝试打开文件时报告打开文件的问题。根据所涉及的程序类型,您可以将其写入日志或在状态窗口中显示。即使您将命令行使用视为理所当然,它仍然应该写入stderr,而不是stdout。

代码也非常纯粹。在C ++中,你可以使它更紧凑:

std::ifstream in(sour->GetFilePath());
std::ofstream out(dest->GetFilePath());

out << in.rdbuf();

现在,这会忽略错误 - 有很多方法可以处理错误(例如在iostream中启用异常),因此很难在不知道你真正需要的情况下显示代码。

答案 1 :(得分:3)

湿婆,我不相信有一个标准的库函数来做到这一点。我认为你必须递归迭代并创建目录并复制文件。我敢打赌,您可以在code.google.com或www.krugle.com上找到执行此操作的源代码

答案 2 :(得分:1)

#include <iostream>
#include <string>
#include <fstream>
#include <dirent.h>

void copyFile(const char* fileNameFrom, const char* fileNameTo){

    char    buff[BUFSIZ];
    FILE    *in, *out;
    size_t  n;

    in  = fopen(fileNameFrom, "rb");
    out = fopen(fileNameTo, "wb");
    while ( (n=fread(buff,1,BUFSIZ,in)) != 0 ) {
        fwrite( buff, 1, n, out );
    }
}

int dir(std::string path){

    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir (path.c_str())) != NULL) {

        while ((ent = readdir (dir)) != NULL) { /* print all the files and directories within directory */
            if (ent->d_name != std::string(".")){          //REMOVE PWD
                if (ent->d_name != std::string("..")){     //REMOVE PARENT DIR

                    std::cout << path << "\\" << ent->d_name << std::endl;

                }
            }
        }

        std::cout << std::endl;

        closedir (dir);
    }else{
        /* could not open directory */
        perror ("");
        return EXIT_FAILURE;
    }

    return 0;
}

int copyAllFiles(std::string sorc, std::string dest){

    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir (sorc.c_str())) != NULL) {

        while ((ent = readdir (dir)) != NULL) { /* print all the files and directories within directory */
            if (ent->d_name != std::string(".")){          //REMOVE PWD
                if (ent->d_name != std::string("..")){     //REMOVE PARENT DIR

                    std::string copy_sorc = sorc + "\\" + ent->d_name;
                    std::string copy_dest = dest + "\\" + ent->d_name;

                    std::cout << "cp " << copy_sorc << " -> " << copy_dest << std::endl;

                    copyFile(copy_sorc.c_str(), copy_dest.c_str());
                }
            }
        }

        std::cout << std::endl;

        closedir (dir);
    }else{
        /* could not open directory */
        perror ("");
        return EXIT_FAILURE;
    }

    return 0;
}

int main(int argc, char* argv[]){

    //dir("C:\\example");                           //SHOWS CONTENT IN FOLDER
    copyAllFiles("C:\\example", "C:\\destination"); //COPY FOLDER'S CONTENT


    return 0;
}

答案 3 :(得分:0)

我对c ++并不熟悉,但也许您可以在目标目录中创建待复制文件夹,并将所有文件复制到该文件夹​​......我猜你可以通过这种方式实现你想要的东西..我觉得c ++中没有可以做到这一点的内置例程,我的意思就像在java中,如果我没有弄错,你只能复制单个文件...我希望我没错。只是一个以为...

答案 4 :(得分:0)

系统调用如system(命令)怎么样。

答案 5 :(得分:0)

C ++标准库不支持文件夹操作。但是你应该看一下以跨平台方式启用功能的Boost.FileSystem

我认为一个好的起点是this example