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로 파일이 있는 것을 볼 수 있다.
'WIN32 API' 카테고리의 다른 글
WIN32 API- 파일 공유 (0) | 2018.12.11 |
---|---|
WIN32 API- 파일의 입출력 예제2 (0) | 2018.12.08 |
WIN32 API- 파일의 입출력 예제1 (0) | 2018.12.07 |
WIN32 API- 파일의 입출력(ReadFile)/(WriteFile) (0) | 2018.12.06 |
WIN32 API- 파일의 입출력(CreateFile) (0) | 2018.12.06 |