1. CopyFile()

// 파일 그 자체를 복사 


BOOL CopyFile(

LPCTSTR lpExisitingFileName, // 복사할 원본파일 이름 

LPCTSTR lpNewFileName, // 복사하여 새로 생성될 파일의 이름 

BOOL bFailIfExists // 새로 생성될 파일이 이미 있을 경우의 동작을 지정 

);                            TRUE -> 실패를 리턴, FALSE -> 기존 파일을 덮는다. 




#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPWSTR lpszClass=L"ApiBase";
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HANDLE hFile;
TCHAR strTemp[128];
DWORD dwRead;
TCHAR strRead[MAX_PATH]; // 읽어들인 문자열을 저장할 버퍼.
switch(iMessage)
{
case WM_RBUTTONDOWN: // 마우스 오른쪽 클릭 시
hdc=GetDC(hWnd);
SetCursor(LoadCursor(NULL,IDC_WAIT));
CopyFile(L"FileInOutExx.txt",L"C:\\Documents and Settings\\hn\\My Documents\\Visual Studio 2008\\Projects\\FileInOutEx\\FileInOutExx7.txt",FALSE);
// 파일 자체를 복사하는 함수이며, 첫 번째 인자는 원본 파일 이름, 새로 만드는 파일의 경로 및 이름, 마지막 인자는 새로 생성될 파일이 이미 있을 경우 동작을 지정하는 것이다.
// FALSE일 경우, 기존 파일을 덮어쓰고 TRUE일 경우, 실패를 리턴한다.
wsprintf(strTemp, L"%s 을 %s로 복사 하였습니다.",L"FileInOutExx.txt",L"FileInOutExx7.txt");
// 서식화된 출력을 문자열 버퍼로 보내는 것. 즉, 화면에 출력하는 것이 아니라 버퍼에 출력하는 것.
TextOut(hdc,100,100,strTemp,wcslen(strTemp));
// 문자열 출력 함수 ( strTemp에 담긴 문자열을 좌표 100,100에 뿌려주는 함수, wcslen(strTemp)는 뿌리는 문자열의 길이를 지정한 것이며, hdc는,, 말그대로 hdc라네...........?
SetCursor(LoadCursor(NULL,IDC_WAIT));
ReleaseDC(hWnd,hdc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage, wParam, lParam));
}






















// FileInOutEx.exe를 실행. 


// 마우스 우클릭



// 코드에서 지정한 경로에 가보면, FileInOutExx7.txt가 생긴 것을 볼 수 있다. 





2. CopyFileEx()

// 파일 복사의 진행량과 같은 중간과정을 확인하기 위해서 사용하는 함수 

// 콜백 함수를 등록하여 주기적으로 호출이 가능함.


BOOL CopyFile(

LPCTSTR lpExisitingFileName, // 복사할 원본파일 이름 

LPCTSTR lpNewFileName, // 복사하여 새로 생성될 파일의 이름 

LPROGRESS_ROUTINE lpProgressRoutine, // 콜백함수 주기적 호출(파일의 복사과정 볼 수 있음)

LPVOID lpData, // 콜백함수 호출 시 들어갈 인수 값 (특별한 경우 아니면 0)

LPBOOL pbCancel, // TRUE 이면 복사 중지, FALSE이면 복사 진행 (복사 진행여부)

DWORD dwCopyFlags // 파일을 복사 수행시 옵션 플래그 (특별한 경우 아니면 0) 

);


DWORD CALLBACK CopyProgressRoutine(
LARGE_INTEGER TotalFileSize, // 총 파일 크기(bytes)
LARGE_INTEGER TotalBytesTransferred, // 소스 파일에서 대상 파일로 이동한 총 파일 크기(bytes)
LARGE_INTEGER StreamSize, // 현재 파일 스트림의 총 크기(bytes)
LARGE_INTEGER StreamBytesTransferred, // 소스 파일에서 대상 파일로 이동한 총 파일 스트림 크기(bytes)
DWORD dwStreamNumber, // 현재의 스트림 넘버
DWORD dwCallbackReason, // 함수 호출의 이유
HANDLE hSourceFile, // 원본 파일의 핸들
HANDLE hDestinationFile, // 대상 파일의 핸들
LPVOID lpData) // CopyFileEx 와 MoveFileWithProgress 함수 호출 시 파라미터
#include <windows.h>
#include <tchar.h>
#define _WIN32_WINNT 0x0500 // copyFileEx 사용시 필수 요소
DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData)
// CopyFileEx 와 MoveFileWithProgress 함수 실행시 사용할 수 있도록 정의된 콜백함수.
{
HDC hdc;
TCHAR str[MAX_PATH];
HWND g_hWnd='\0'; // 널값으로 초기화 (여기서 애먹음..ㅎㅎ 어디서 선언해야할까를 고민했고,, 선언했는데 디버깅 에러나서 애먹고,, 선언을 하고 널로 초기화를 하니 문제 해결!)
hdc=GetDC(g_hWnd);
wsprintf(str,L"%d 중 %d 바이트 복사중......",TotalFileSize.LowPart, TotalBytesTransferred.LowPart);
TextOut(hdc,100,100,str,wcslen(str)); // str에 담긴 문자열을 100,100 좌표에 출력
ReleaseDC(g_hWnd,hdc);
return PROGRESS_CONTINUE;
}
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPWSTR lpszClass=L"ApiBase";
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HANDLE hFile;
TCHAR strTemp[128];
DWORD dwRead;
TCHAR strRead[MAX_PATH]; // 읽어들인 문자열을 저장할 버퍼.
switch(iMessage)
{
case WM_RBUTTONDOWN: // 마우스 오른쪽 클릭 시
hdc=GetDC(hWnd);
SetCursor(LoadCursor(NULL,IDC_WAIT));
//CopyFile(L"FileInOutExx.txt",L"C:\\Documents and Settings\\hn\\My Documents\\Visual Studio 2008\\Projects\\FileInOutEx\\FileInOutExx7.txt",FALSE);
//wsprintf(strTemp, L"%s 을 %s로 복사 하였습니다.",L"FileInOutExx.txt",L"FileInOutExx7.txt");
//TextOut(hdc,100,100,strTemp,wcslen(strTemp));
CopyFileEx(L"ulala.mp4",L"C:\\Documents and Settings\\hn\\My Documents\\Visual Studio 2008\\Projects\\FileInOutEx\\parkseungil.mp4",
LPPROGRESS_ROUTINE(CopyProgressRoutine),0,FALSE,0);
//ulala.mp4의 파일을 지정된 경로에 parkseungil.mp4로 저장시키기. 콜백함수를 주기적으로 호출하여 파일의 복사과정을 볼 수 있게 해주는게 CopyProgressRoutine이며, 자동형변환이 되지 않아
// 강제적으로 LPPROGRESS_ROUTINE()로 맞춰주었다. 또한, 이것은 복사를 진행하기위해 FALSE를 사용하였다.TRUE라면 복사를 중지한다. 3번째, 5번째의 인자는 각각 콜백함수 호출 시 인수 값과
// 복사 수행시 옵션 플래그값을 의미하며 특수한 경우가 아니라면 0을 적는다.
MessageBox(hWnd,L"파일 복사가 완료 되었습니다.",L"알림",MB_OK);
SetCursor(LoadCursor(NULL,IDC_WAIT));
ReleaseDC(hWnd,hdc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage, wParam, lParam));
}
// ulala.mp4를 복사할 예정


// FileInOutEx.exe를 실행 -> 우클릭 -> 파일 복사

(복사되는 진행상황을 볼 수 있다)


// 지정된 경로에 parkseungil.mp4로 파일이 있는 것을 볼 수 있다.




+ Recent posts