윈도우 32비트 프로그래밍 36 |
안녕하세요................돌팔이 오늘은 또 다른 방법으로 파일 입출력을 해보도록 하겠습니다. 이 방법은 앞에서 알아 본 자 그러면 어떤 식으로 하는지 구체적으로 알아 봅시다. 먼저 약간 다른 점이 하나 있습니다. HANDLE CreateFile( 우리가 앞에서 알아본 파일 입출력함수들은 HFILE이라는 자료형을 사용했던 것에 비해서 첫번째 파라미터인 lpszName에는 생성하거나 열 파일이름을 지정하면 됩니다. 두번째 GENERIC_READ 읽기 전용으로 파일을 엽니다. 세번째 파라미터인 fdwShareMode는 파일을 공유할 것인지 지정하는 곳인데 이곳에 0 파일을 공유하지 네번째 파라미터인 lpsa에는 보통 NULL값을 지정합니다. 그리고 다섯번째 파라미터인 CREATE_NEW 파일을 생성합니다. 파일을 생성하는 CREATE_NEW와 CREATE_ALWAYS의 차이점은 무엇일까요? 여섯번째 파라미터인 fdwAttrsAndFlags는 파일의 속성을 지정하는 것인데 이곳에는 FILE_ATTRIBUTE_NORMAL 일반적인 파일을 마지막 파라미터인 hTemplateFile에는 보통 NULL을 지정하여 사용합니다. 자 파일을 생성하고 여는 기능을 가진 함수인 CreateFile()함수에 대해 알아 보았으니 BOOL CloseHandle( 파라미터로 파일을 열었을 때 얻은 파일의 핸들을 지정해 주면 됩니다. 자 이번에는 파일에서 정보를 읽고 쓰는 함수에 대해 알아 보죠. 파일에 정보를 기록할 때에는 BOOL WriteFile( 함수 이름에서도 쉽게 정보를 기록하는 역할을 한다는 것을 알 수 있죠? 각 파라미터가 첫번째 파라미터에는 파일의 핸들을 지정해 주면 됩니다. 앞에서 알아본 CreateFile() 이번에는 정보를 읽어올 수 있는 ReadFile() 함수에 대해 알아 보죠. 파라미터의 BOOL ReadFile( 자 그러면 우리가 앞에서 만들어 본 파일 입출력 예제 프로그램을 지금 배운 IO 함수를 MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, typedef struct tagMYFILE MYFILE MyFile; int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK static char cHeader; switch(message) cHeader = ' case WM_PAINT : hDC = BeginPaint(hWnd, case WM_COMMAND : switch(LOWORD(wParam)) SaveProc(); case 200 : LoadProc(); case WM_DESTROY : PostQuitMessage(0); void SaveProc(void) tmpMyFile.cHeader = hFile = CreateFile("e:\test.txt", void LoadProc(void) hFile = CreateFile("e:\test.txt", char GetHeader(void) LPSTR GetData(void) 역시 마찬가지로 크게 네개의 함수가 보이죠? 각 함수를 보도록 합시다. void SaveProc(void) 이 함수는 정보를 저장하는 역할을 합니다. HANDLE hFile; 앞에서 알아 본 HFILE이라는 자료형 대신에 HANDLE이라는 자료형을 MYFILE tmpMyFile; tmpMyFile.cHeader = hFile = CreateFile("e:\test.txt", 파일을 생성해서 그 파일을 쓰기 전용으로 열고 있는 구문입니다. 일반적인 파일의 속성을 가진 WriteFile(hFile, (char *)&tmpMyFile, 파일에 정보를 기록하고 닫는 구문입니다. } void LoadProc(void) 이 함수는 파일에서 정보를 읽어오는 역할을 합니다. HANDLE hFile; hFile = CreateFile("e:\test.txt", 존재하는 파일을 읽기전용으로 열고 있는 구문입니다. ReadFile(hFile, (MYFILE *)&MyFile, 파일에서 정보를 읽고 닫는 구문입니다. } char GetHeader(void) LPSTR GetData(void) 읽어온 정보의 값을 되돌려 주고 있는 역할을 하는 것이 바로 위 두개의 함수입니다. 자 오늘은 여기까지 |
윈도우 32비트 프로그래밍 37 |
안녕하세요...........돌팔이 황동준입니다. 이번시간에는 파일을 복사하고 옮기고 지우는 작업을 프로그램상에서 어떻게 구현하는지 알아 먼저 파일을 복사하는 함수를 보도록 합시다. 파일을 복사할때에는 CopyFile()이라는 BOOL CopyFile( 첫번째 파라미터에 복사할 파일이름을 지정하면 되고 두번째 파라미터에 복사될 파일이름을 세번째 파라미터는 이미 파일이 존재할 때 어떻게 할 것인지 지정하는 것입니다. 만약에 이 자 이번에는 파일을 옮기는 역할을 하는 MoveFile()함수입니다. BOOL MoveFile( 더 간단하죠? 첫번째 파라미터는 옮길 파일 이름을 지정하면 되고 두번째 파라미터에는 마지막으로 파일을 지우는 함수인 DeleteFile() 함수입니다. BOOL DeleteFile( 지울 파일이름을 파라미터로 지정해 주면 됩니다. 파일을 복사, 옮기고, 지우는 것이 상당히 쉽죠? 그러면 앞에서 만든 프로그램에 이 기능을 MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, typedef struct tagMYFILE MYFILE MyFile; int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK static char cHeader; switch(message) cHeader = ' case WM_PAINT : hDC = BeginPaint(hWnd, case WM_COMMAND : switch(LOWORD(wParam)) SaveProc(); case 200 : LoadProc(); case 300 : CopyFile("e:\test.txt", case 400 : MoveFile("e:\test.txt", case 500 : DeleteFile("e:\test.txt"); case WM_DESTROY : PostQuitMessage(0); void SaveProc(void) tmpMyFile.cHeader = hFile = CreateFile("e:\test.txt", void LoadProc(void) hFile = CreateFile("e:\test.txt", char GetHeader(void) LPSTR GetData(void) 너무 간단해서 설명 드릴부분은 없는것 같군요. case 300 : CopyFile("e:\test.txt", "e:\test1.txt", test.txt 파일을 test1.txt 파일로 복사하는 구문입니다. case 400 : MoveFile("e:\test.txt", test.txt 파일을 test1.txt 파일로 이름을 바꾸는 구문입니다. case 500 : DeleteFile("e:\test.txt"); test.txt 파일을 지우는 구문입니다. 오늘은 여기까지 |
윈도우 32비트 프로그래밍 38 |
안녕하세요................돌팔이 이번 시간에는 원하는 파일을 찾는 방법을 알아 보도록 하겠습니다. 윈도우즈용으로 제작된 파일 HANDLE FindFirstFile( 위 함수를 이용해서 원하는 파일을 찾을 수 있습니다. 첫번째 파라미터에 찾으려는 파일이름을 typedef struct _WIN32_FIND_DATA { 첫번째 맴버인 dwFileAttributes에는 찾은 파일의 속성이 저장되는데 이 부분에 FILE_ATTRIBUTE_ARCHIVE 아카이브 파일을 두번째 맴버인 ftCreationTime에는 파일이 만들어진 시간이 저장되는데 이것에 대한 세번째 맴버인 ftLastAccessTime에는 파일이 가장 최근에 어세스된 시간이 네번째 맴버인 ftLastWriteTime에는 파일이 최근에 수정된 시간이 다섯번째 맴버인 nFileSizeHigh에는 파일 크기의 상위워드 값이 저장되고 여섯번째 그리고 아홉번째 맴버인 cFileName에는 찾은 파일 이름이 저장됩니다. 우리가 이번에 만들고자 하는 프로그램에서는 굳이 이 구조체 변수를 활용할 필요는 없으나 자 그러면 한가지 더 알아 봅시다. 파일 IO 부분을 할때 파일을 열고 나서 나중에 그 BOOL FindClose( 위 함수를 사용하면 됩니다. 자 그러면 실제로 파일을 찾는 프로그램을 하나 만들어 봅시다. 아주 간단하게 구현할 수 MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) switch(LOWORD(wParam)) bOK = case WM_DESTROY : PostQuitMessage(0); BOOL SearchFile(char hFile = FindFirstFile(str, 위 프로그램은 e:\src\comm\tty.cpp 파일을 찾는 프로그램인데 파일을 그러면 구체적으로 프로그램 소스를 보도록 합시다. 제가 만든 SearchFile()이라는 BOOL SearchFile(char 위 구조체는 이미 앞에서 설명 드렸을 겁니다. 그러나 이번 프로그램에서는 이 구조체를 HANDLE hFile; hFile = FindFirstFile(str, &ff); 파라미터로 지정된 파일을 찾는 구문입니다. if(hFile != 파일을 찾지 못하면 INVALID_HANDLE_VALUE라는 값을 리턴한다는 것을 보여주고 } 이해하는데 크게 어려운 점은 없을 겁니다. 오늘은 여기까지 |
윈도우 32비트 프로그래밍 39 |
안녕하세요................돌팔이 이번시간에도 파일 찾는 프로그램을 하나 만들어 볼텐데 위에서 만든 프로그램보다는 조금 더 만들기 전에 함수하나를 더 알아야 합니다. 우리가 앞에서 배운 FindFirstFile() BOOL FindNextFile( 첫번째 파라미터에 FindFirstFile()함수에서 얻은 파일 핸들을 지정하면 되고 두번째 MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) switch(LOWORD(wParam)) SearchFile(hWnd, case WM_DESTROY : PostQuitMessage(0); void SearchFile(HWND hWnd, char bOK = TRUE; hDC = GetDC(hWnd); 위 프로그램은 e:\src\aram디렉토리내에 있는 모든 파일과 디렉토리를 찾는 void SearchFile(HWND hWnd, char bOK = TRUE; 아래에 보면 while문이 있는데 처음에 파일을 찾으면 이 구문안을 실행하기 위해서 nY = 0; hDC = GetDC(hWnd); 처음에 파일을 찾으면 while문이 실행되서 찾은 파일이나 디렉토리가 화면에 출력될 while(bOK && (hFile != 구조체 맴버중 cFileName에 찾은 파일이나 디렉토리 이름이 저장된다고 앞에서 설명드렸을 bOK = FindNextFile(hFile, &ff); 계속해서 파일을 찾아나가고 있습니다. 파일이나 디렉토리를 찾으면 TRUE가 그렇게 복잡하지는 않죠? 오늘은 여기까지 |
윈도우 32비트 프로그래밍 40 |
안녕하세요..............돌팔이 황동준입니다.................. 이번시간에는 파일 정보를 알아 내는 방법을 알아 보겠습니다. 다양한 정보를 얻을 수 있도록 DWORD GetFileSize(HANDLE hFile, LPDWORD 위 함수를 이용하면 파일의 크기를 리턴받을 수 있는데 첫번째 파라미터에 파일의 핸들을 지정해 자 그러면 파일이 가지고 있는 시간에 대한 정보를 얻는 방법을 알아 봅시다. BOOL GetFileTime( 위 함수를 이용해서 시간에 대한 정보를 읽어올 수 있는데 첫번째 파라미터는 당연히 파일의 아래는 FILETIME 구조체의 원형입니다. typedef struct _FILETIME { 첫번째 맴버는 시간의 하위 비트를 의미하고 두번째 맴버는 상위 비트를 의미합니다. 위 GetFileTime()함수로 원하는 시간을 얻었다면 다 된 것일까요? 그렇지 않습니다. BOOL FileTimeToSystemTime( 첫번째 파라미터로 우리가 쪼갤(?) FILETIME 구조체 변수입니다. 두번째 파라미터에는 typedef struct _SYSTEMTIME { 각 맴버가 무엇을 의미하는지 설명드리지 않아도 알겠죠? 맴버 이름이 잘 정해져있군요. 자 그러면 우리가 배운것을 이용해서 프로그램을 만들어 봅시다. MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, typedef struct tagMYFILE int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(LOWORD(wParam)) SaveProc(); case 200 : GetTextFileSize(hWnd); case 300 : GetTextFileTime(hWnd); case WM_DESTROY : PostQuitMessage(0); void SaveProc(void) tmpMyFile.cHeader = hFile = CreateFile("e:\test.txt", void GetTextFileSize(HWND hWnd) hFile = CreateFile("e:\test.txt", void GetTextFileTime(HWND hWnd) hFile = CreateFile("e:\test.txt", FileTimeToSystemTime(&CreateFileTime, sprintf(szBuff1, "This File is Created Year : FileTimeToSystemTime(&AccessFileTime, sprintf(szBuff2, "This File is Accessed Year : FileTimeToSystemTime(&ModifyFileTime, sprintf(szBuff3, "This File is Modified Year : hDC = GetDC(hWnd); 제가 만든 함수 두개만 알아 보면 되겠네요. void GetTextFileSize(HWND hWnd) 이 함수는 파일의 크기를 얻어서 그 값을 화면에 출력하는 역할을 합니다. HANDLE hFile; hFile = CreateFile("e:\test.txt", 파일 크기를 얻기 위한 GetFileSize()함수의 첫번째 파라미터가 파일 핸들을 dwSize = GetFileSize(hFile, NULL); 파일 크기를 얻고 있는 과정입니다. CloseHandle(hFile); 얻은 파일크기를 화면에 출력하고 있습니다. } void GetTextFileTime(HWND hWnd) 이 함수는 파일이 생성된 시간, 어세스된 시간, 수정된 시간을 얻어서 그 시간을 화면에 HANDLE hFile; hFile = CreateFile("e:\test.txt", 시간을 얻기 위한 GetFileTime()함수의 첫번째 파라미터가 파일핸들을 요구하므로 위 GetFileTime(hFile, &CreateFileTime, 시간 정보를 얻고 있는 구문입니다. CloseHandle(hFile); FileTimeToSystemTime(&CreateFileTime, 64비트 시간 정보를 알아볼수 있는 시간 형태로 변환하고 있습니다. sprintf(szBuff1, "This File is Created Year : FileTimeToSystemTime(&AccessFileTime, 64비트 시간 정보를 알아볼수 있는 시간 형태로 변환하고 있습니다. sprintf(szBuff2, "This File is Accessed Year : FileTimeToSystemTime(&ModifyFileTime, 64비트 시간 정보를 알아볼수 있는 시간 형태로 변환하고 있습니다. sprintf(szBuff3, "This File is Modified Year : hDC = GetDC(hWnd); 변환된 시간을 화면에 출력하고 있습니다. } 오늘은 여기까지 |