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)
버그 수정: 원본과 대상이 동일할 때의 문제를 처리했습니다.
파일을 복사하다가 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;
}
#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++)
<< Home