2010-02-10 8 views
2

안녕하세요 ... 어느 한 폴더에서 다른 디렉터리로 폴더를 복사하는 방법에 대한 코드를 제공 할 수 있습니까?이 코드로 파일을 복사 할 수 있지만 한 번에 entir 폴더를 복사 할 수 없습니다 ...C++에서 한 경로에서 다른 폴더로 폴더를 복사하는 방법

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); 

답변

3

Shiva, 나는 이것을 수행하는 표준 라이브러리 기능이 있다고 생각하지 않습니다. 당신이 반복적으로 반복하고 디렉터리를 만들고 파일을 복사해야한다고 생각합니다. code.google.com 또는 www.krugle.com에서이 작업을 수행하는 소스 코드를 찾을 수 있습니다.

+0

당신은 내가 다음 검색어 ** INT copyDirectory \ (const를 사용하여 lang을 입력 http://www.google.com/codesearch로 이동 코드를 –

+0

시바을 찾기가 타격 내기 Mr.Smith을 잃었다 , 결과에서 ** libs/host/CopyFile.c **를 찾으십시오. –

0

저는 C++에 익숙하지 않지만 대상에 복사 할 폴더를 만들 수 있습니다. 디렉토리, 그리고 그 폴더에있는 모든 파일을 복사 ... 당신이 원하는 방식으로 원하는 것을 얻을 수있을 것 같아요 ... 난 그냥 내장 된 루틴은 C++에서 할 수있는, 그게 할 수있는 자바에서 같은 뜻이야 오해하지 마시고, 당신은 개별 파일만을 복사 할 수 있습니다 ... 나는 잘못 생각한 게 아니라고 생각합니다. 그냥 생각 ...

0

시스템 호출 (시스템)에 대해서는 어떻습니까?

+0

플랫폼에 독립적이지 않습니다. 그런 식으로 할 경우 winapi 함수 (또는 동등한 * nix 함수)를 사용하십시오. 어떻게하면 똑같은 일을하는지 보지만 별도의 프로세스를 시작하지 않고 볼 수 있습니다. –

4

이식성있는 코드로 이것을하고 싶다면 Boost 파일 시스템 라이브러리를 사용해보아야 할 것이다. 약간의 이식성을 위해 아마도 Posix 디렉토리 함수 (opendir, readdir, closedir, chdir 등)를 사용할 수 있습니다. 이식성에 전혀 신경 쓰지 않으면 시스템 고유의 것을 사용할 수 있습니다 (예 : Windows FindFirstFile , FindNextFile, FindClose, SetCurrentDirectory).

실제 파일 복사가 진행되는 한 코드는 실제 환경에서는 잘 작동하지 않습니다. 예를 들어 파일을 열려고 할 때 바로 파일을 여는 것과 같은 문제는 일반적으로보고하지 않습니다. 관련된 프로그램의 종류에 따라 로그에 기록하거나 상태 창에 표시 할 수 있습니다. 명령 줄 사용을 당연하게 받아들이더라도 stdout이 아니라 stderr에 기록해야합니다.

코드는 C++에서 거의 순수한 C., 당신은 좀 더 컴팩트 만들 수 있습니다

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

out << in.rdbuf(); 

는 지금,이 오류를 무시 - 사람들을 처리하는 여러 가지 방법이 (가 예를 들어 iostream에서 예외를 허용하는 등) 실제로 원하는 것을 알지 못하면 코드를 표시하기가 어렵습니다.

0

C++ 표준 라이브러리는 폴더 작업을 지원하지 않습니다. 그러나 교차 플랫폼 방식으로 기능을 사용할 수 있도록 Boost.FileSystem을 조사해야합니다.

좋은 출발점은 this example이라고 생각합니다. ** C :

+0

[C++ 17의 파일 시스템 정적 클래스] (http://en.cppreference.com/w/cpp)와 함께 제공되는 것을 볼 수 있습니다./filesystem). 내 OSX는 아직 2016 년에 (최신 OSX 업데이트로) 여기에 없다.'#include '을 시도하고 Xcode가 파일을 찾을 수 없다고 말했다. – Volomike

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; 
} 
관련 문제