본문으로 바로가기
homeimage
  1. Home
  2. 컴퓨터/프로그래밍
  3. C언어 파일 복사 함수 filecopy()

C언어 파일 복사 함수 filecopy()

· 댓글개 · 바다야크

C언어 파일 복사 함수 filecopy()

C언어에서 사용할 수 있는 파일 복사 함수 filecopy()입니다. 원본 파일 이름과 사본 파일 이름을 인수로 넘겨주면 되며, 실행 결과를 아래의 상수 값으로 반환합니다.

  • 0 : 파일 복사 완료
  • -1 : 사본 파일 이름이 원본과 같습니다.
  • -2 : 원본 파일 읽기 에러
  • -3 : 사본 파일 생성 에러
  • -4 : 사본 파일 쓰기 에러

함수 호출 후에 반환 값이 0이면 정상적으로 파일이 복사된 것입니다. -1인 경우 생성하려는 파일 이름이 원본과 같을 때입니다. -2는 원 파일 읽기를 못할 때, -3과 -4는 대상 파일 처리 중 에러가 발생한 것입니다.

filecopy() 함수 사용 예제

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>

int filecopy( const char  *psour, const char  *pdest) {

    FILE	*fsour, *fdest;
    char       
    buff[1024];
	size_t     n_size;

    if (! strcmp(psour, pdest))   return       -1; // 원본과 사본 파일이 동일하면 에러
    
    if ( NULL == (fsour = fopen(psour, "rb")) )    return -2; // 원본 파일 열기
    if ( NULL == (fdest = fopen(pdest, "wb")) ){
        fclose(fsour);
        return -3;
    } // 대상 파일 만들기
    
    while ( 0 < (n_size = fread( buff, 1, sizeof(buff), fsour)) ){
        if ( 0 == fwrite(buff, 1, n_size, fdest)) {
            fclose(fsour);
            fclose(fdest);
            unlink(pdest); // 에러난 파일 지우고 종료
            return -4;
        }
    }
    fclose(fsour);
    fclose(fdest);
    
    return 0;
}

int   main( int argc, char **argv )
{
    if ( 3 > argc){
		printf("file names are missed\n");
		printf("usage: ]$ %s abc.bmp dest.bmp\n", argv[0]);
		return 1;
	}

    switch( filecopy( argv[1], argv[2])){
    case   -1 : printf( "대상 파일 이름이 원본과 같습니다.\n"); break;
    case   -2 : printf( "원본 파일 읽기 에러.\n"); break;
    case   -3 : printf( "사본 파일 생성 에러.\n"); break;
    case   -4 : printf( "사본 파일 쓰기 에러.\n"); break;
    default   : printf( "복사 완료.\n"); break;
    }
    return 0;
}

예제 실행 결과

예제에서는 test.c 파일을 test.bck로 복사하고, 생성된 test.bck 파일의 내용을 확인합니다.

jwjw@test$ gcc test.c
jwjw@test$ ./a.out test.c test.c
대상 파일 이름이 원본과 같습니다.
jwjw@test$ ./a.out test.c test.bck
복사 완료.
jwjw@test$ cat test.bck
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>

int filecopy( const char  *psour, const char  *pdest) {

    FILE        *fsour, *fdest;
    char
    buff[1024];
        size_t     n_size;

    if (! strcmp(psour, pdest))   return       -1; // 원본과 사본 파일이 동일하면 에러

    if ( NULL == (fsour = fopen(psour, "rb")) )    return -2; // 원본 파일 열기
    if ( NULL == (fdest = fopen(pdest, "wb")) ){
        fclose(fsour);
        return -3;
    } // 대상 파일 만들기

    while ( 0 < (n_size = fread( buff, 1, sizeof(buff), fsour)) ){
        if ( 0 == fwrite(buff, 1, n_size, fdest)) {
            fclose(fsour);
            fclose(fdest);
            unlink(pdest); // 에러난 파일 지우고 종료
            return -4;
        }
    }
    fclose(fsour);
    fclose(fdest);

    return 0;
}

int   main( int argc, char **argv )
{
    if ( 3 > argc){
                printf("file names are missed\n");
                printf("usage: ]$ %s abc.bmp dest.bmp\n", argv[0]);
                return 1;
        }

    switch( filecopy( argv[1], argv[2])){
    case   -1 : printf( "대상 파일 이름이 원본과 같습니다.\n"); break;
    case   -2 : printf( "원본 파일 읽기 에러.\n"); break;
    case   -3 : printf( "사본 파일 생성 에러.\n"); break;
    case   -4 : printf( "사본 파일 쓰기 에러.\n"); break;
    default   : printf( "복사 완료.\n"); break;
    }
    return 0;
}jwjw@test$
SNS 공유하기
💬 댓글 개
최근글
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.