Coding & Programming/C, C++

[C언어/C++] 스레드 이용하여 파일 복사 하기(1/3) - CopyFile 함수 + _beginthreadex 함수 예제

mainCodes 2021. 4. 29. 10:05

스레드 이용하여 파일 복사 하기(1/3) - CopyFile 함수 + _beginthreadex 함수 예제(CopyFile, _beginthreadex functions example)

 

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

윈도우 환경에서 파일을 복사하는 방법은 여러 가지가 있습니다. 대표적인 방법은 CopyFile API를 사용하는 방법, FILE 스트림 계열의 fopen, fwrite, fread 등의 함수를 이용하는 방법, 저수준 파일 입출력 함수인 open, read, write 등의 함수를 이용하는 방법이 있습니다.

 

🔗 파일 복사 방법 종류

 


① CopyFile 함수 이용
② 파일스트림(FILE 구조체) 함수 이용
③ 저수준 파일 입출력 함수 이용

 

먼저 Windows에서 제공하는 CopyFile 함수를 이용한 방법에 대해 정리해볼 텐데요.  CopyFile를 사용하면 매우 간단히 파일 복사 기능을 구현할 수 있습니다.


BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);

그런데 함수 프로토타입을 보면 파일명을 전달하는 매개변수들의 데이터 타입(자료형)이 char 타입이 아닌 재정의된 LPCTSTR인 것을 볼 수 있습니다. 이는 윈도우 운영체제가 MBCS(Multi-Byte Character Set) 또는 Unicode형태의 프로그램 개발 환경을 지원하기 위함인데요. 본 포스팅은 스터디에 포커스가 맞춰져 있어 Visual Studio 프로젝트 환경에서 Chracter Set을 Use Multi-Byte Character Set으로 설정하였습니다. 

 

 

※ 참고
Character Set을 Use Unicode Character Set으로 설정을 원한다면 다음과 같이 TCHAR 타입을 사용할 것을 권합니다. 이유는 MBCS, Unicode 선택에 따라 소스코드를 변경할 필요가 없기 때문입니다.

#include <tchar.h>         //tchar.h 포함

...

TCHAR sourceFile[] = _T("maincodes.exe");

TCHAR targetFile[] = _T("JollyTree.exe");

 

🔗 CopyFile 함수 예제(Function example):

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <windows.h>
#include <process.h> 
 
unsigned int WINAPI copyFileService(void* params)
{
    char sourceFile[] = "maincodes.exe";
    char targetFile[] = "JollyTree.exe";
 
    puts(" >> 스레드 시작");
    if (CopyFile(sourceFile, targetFile, FALSE) != TRUE)
    {
        puts("CopyFile() 에러 !!");
        return -1;
    }
 
    printf(" >> %s 를 %s 이름으로 복사하였습니다.\n", sourceFile, targetFile);
    puts(" >> 스레드 종료!!");
    _endthreadex(0);
    return 0;
}
 
int main()
{
    unsigned int tid;
    HANDLE mainthread;
 
    mainthread = (HANDLE)_beginthreadex(NULL0, copyFileService, (void*)00&tid);
    if (mainthread)
    {
        WaitForSingleObject(mainthread, INFINITE);
        CloseHandle(mainthread);
    }
    puts(" >> 프로그램 종료!!");
    return 0;
}
cs

 

예제는 copyFileService() 함수를 스레드 시작 루틴으로 사용하고 스레드 안에서 CopyFile 함수를 호출합니다. 실행결과 JollyTree.exe라는 파일이 정상적으로 복사된 것을 확인할 수 있습니다.

 

🔗 실행결과(Output):

 

 

상 JollyTree였습니다. (•̀ᴗ•́)و