mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Sunday, February 25, 2007

C언어] 파일 복사 함수, 화일 카피 소스; File Copy Function Source Code


C에는 파일 복사 함수가 없기에 직접 만들어 주어야 하는데, 복사 자체는 쉽지만 에러 처리 부분이 상당히 복잡하고 어렵습니다. 그래서 이 소스를 만드는 데 1주일 넘게 걸렸지만 아직 완벽하지는 않습니다.

파일을 복사하다가 Ctrl+C나 Ctrl+Break키를 눌렀을 때에는, 복사 중인 파일 전체를 지우고 프로그램을 종료해야 하는데, 볼랜드C와 달리, 비주얼C에서 Ctrl+C 처리 부분이 잘 안되더군요. 그리고 테스트를 많이 했지만 제가 발견하지 못한 버그가 아직 있을지도 모르겠습니다.


int fileCopy(const char* src, const char* dst)

라는 함수가 본체인데,

fileCopy("원본_파일_경로", "사본_파일_경로")
의 형식으로 파라미터를 입력하고, 에러가 나면 에러 코드를 정수로 반환합니다.

원본 파일명과 사본 파일명이 다르면, 현재 디렉토리에 다른 이름으로 복사됩니다.

대부분의 경우에는 원본과 사본의 파일명이 같고, 사본 파일의 디렉토리만 다릅니다. 즉 다른 디렉토리로 복사하는 것입니다.


다음 예제는 현재 디렉토리(폴더)에 있는 test.mp3 라는 파일을,

현재 디렉토리의 하위 디렉토리인 000 이라는 이름의 디렉토리 밑에 복사합니다.

파일 복사 함수 사용법 예제


소스 파일명: file_copy.cpp
(버전 0.4c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MSIZE 16777216  // 16메가로 메모리 버퍼 지정

int fileCopy(const char* src, const char* dst);


int main(void) {
  int e = fileCopy("test.mp3", "000/test.mp3");

  if (e == 0)
    printf("파일이 복사되었습니다.\n");
  else {
    switch (e) {
      case  1 : fputs("원본 파일을 열 수 없습니다.\n", stderr); break;
      case  2 : fputs("대상 파일에 쓸 수 없습니다. 읽기 전용?\n", stderr); break;
      case  3 : fputs("쓰기 에러, 디스크 용량 초과?\n", stderr); break;
      case  4 : fputs("원본 경로와 대상 경로가 동일합니다\n", stderr); break;
      case 10 : fputs("메모리가 부족합니다\n", stderr); break;
      default : fputs("알 수 없는 에러\n", stderr); break;
    }
  }

  return 0;
}




// 파일 복사 함수의 본체
int fileCopy(const char* src, const char* dst) {
  FILE *in, *out;
  char* buf;
  size_t len;

  if (!strcmpi(src, dst)) return 4; // 원본과 사본 파일이 동일하면 에러

  if ((in  = fopen(src, "rb")) == NULL) return 1; // 원본 파일 열기
  if ((out = fopen(dst, "wb")) == NULL) { fclose(in); return 2; } // 대상 파일 만들기

  if ((buf = (char *) malloc(MSIZE)) == NULL) { fclose(in); fclose(out); return 10; } // 버퍼 메모리 할당

  while ( (len = fread(buf, sizeof(char), sizeof(buf), in)) != NULL )
    if (fwrite(buf, sizeof(char), len, out) == 0) {
      fclose(in); fclose(out);
      free(buf);
      _unlink(dst); // 에러난 파일 지우고 종료
      return 3;
    }

  fclose(in); fclose(out);
  free(buf); // 메모리 할당 해제

  return 0;
}





버그 수정: 원본과 대상이 동일할 때의 문제를 처리했습니다.




tag: cpp
C언어 | C/C++ (Visual C++)

0 Comments:

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top