파일만들기
CreateFile() 함수 : 파일 생성 함수
HANDLE CreateFile( LPCTSTR lpFileName, // 생성하고자 하는 파일명 DWORD dwDesiredAccess, // 읽기, 쓰기, 읽기/쓰기 세 가지 모드 중 하나 지정 DWORD dwShareMode, // 파일의 공유 모드 지정 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 파일의 보안 속성에 대한 포인터 DWORD dwCreationDisposition, // 파일을 생성할 것인지 열 것인지 지정. DWORD dwFlagsAndAttributes, // 생성할 파일의 속성 HANDLE hTemplateFile // 새로 만들 파일의 속성을 제공할 템플릿 파일 ); |
LPCTSTR lpFileName : 파일 이름을 문자열 쓴다.
DWORD dwDesiredAccess : 파일 용도를 읽기, 쓰기, 읽기/쓰기 세 가지 모드 중 하나로 지정
읽기 : GENERIC_READ
쓰기 :
읽기/쓰기 : GENERIC_READ | GENERIC_WRITE
DWORD dwShareMode : 파일 공유 여부를 명시. 읽기 공유와 쓰기 공유
읽기 공유 : FILE_SHARE_READ
쓰기 공유 : FILE_SHARE_WRITE
LPSECURITY_ATTRIBUTES lpSecurityAttributes : 보안 속성에 대한 포인터로 생성된 파일의 핸들이 이후에 생성될 자녀 프로세스에 상속될 수 있는지를 알려준다.
DWORD dwCreationDisposition : 파일 생성 모드를 지정한다. 파일을 만들거나 열려는 파일 이름이 이미 존재하거나 존재하지 않을 때 어떻게 할지 명시한다.
만들기 모드 : CREATE_NEW (동일한 파일이 존재하면 파일을 만들지 않음)
강제로 만들기 모드 : CREATE_ALWAYS (동일한 파일이 존재해도 파일을 새로 만듦)
기존 파일 열기 모드 : OPEN_EXISTING (존재하는 파일만 엶)
강제 열기 모드 : OPEN_ALWAYS (파일이 없는 경우에는 직접 파일을 생성하여 파일을 열기)
DWORD dwFlagsAndAttributes : 생성되는 파일의 속성을 지정, 읽기 전용파일, 시스템 파일, 숨겨진 파일 등을 지정
FILE_ATTRUBUTE_ARCHIVE : 쓰기 속성으로 생성
FILE_ATTRUBUTE_ENCRYPTED : 파일을 암호화하여 생성
FILE_ATTRUBUTE_HIDDEN : 숨김 파일로 생성
FILE_ATTRUBUTE_NORMAL : 아무런 속성도 없는 파일을 생성
FILE_ATTRUBUTE_NOT_CONTENT_INDEXED : 콘텐츠 인덱싱 서비스에 대해 인덱스되지 않도록 한다.
FILE_ATTRUBUTE_OFFLINE : 데이터가 오프라인 상태로 즉시 사용할 수 없음
FILE_ATTRUBUTE_READONLY : 읽기 전용 속성으로 생성
FILE_ATTRUBUTE_SYSTEM : 시스템 파일로 생성
FILE_ATTRUBUTE_TEMPORARY : 임시 파일로 생성
HANDLE hTemplateFile : 새로 만들 파일의 속성을 제공할 템플릿 파일, 지원하지 않으면 반드시 NULL이어야 함
ReadFile() 함수 : 파일 읽기
BOOL ReadFile ( HANDLE hFile, // 읽으려는 파일의 핸들 LPVOID lpBuffer, // 읽어 온 데이터를 저장할 버퍼의 포인터 DWORD nNumberOfBytesToRead, // 읽으려는 바이트 수 LPDWORD lpNumberOfBytesRead, // 실제로 읽은 바이트 수를 반환 받기 위한 출력용 인수 LPOVERLAPPED lpOverlapped // 구조체 OVERLAPPED에 대한 포인터. 생성된 파일 핸들인 hFile을 // 생성하거나 열 때 FILE_FLAG_OVERLAPPED를 이용했다면 포인터 값을 제공해야 한다. ); |
WriteFile() 함수 : 파일 쓰기
BOOL WriteFile( HANDLE hFile, // 쓰고자 하는 파일의 핸들 변수 LPVOID lpBuffer, // 파일에 쓸 내용을 저장할 변수 DWORD nNumberOfBytesToWrite, // 쓰고자 하는 내용의 크기를 바이트 단위로 나타낸 수 LPDWORD lpNumberOfBytesWritten // 실제로 쓴 바이트 수를 저장할 공간의 주소 LPVOERLAPPED lpOverlapped // 구조체 OVERLAPPED에 대한 포인터, 생성된 파일 핸들인 hFile을 // 생성하거나 열 때 FILE_FLAG_OVERLAPPED를 이용했다면 포인터 값을 제공해야 한다. ); |
CloseHandle() 함수 : 파일 닫기
CloseHandle(HANDLE hFile); |
파일 입출력 예제로 "test.txt"을 열어 불러오고 저장하기
#include <windows.h> #include <TCHAR.H>
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS WndClass; hInst = hInstance; WndClass.style = CS_HREDRAW | CS_VREDRAW; WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInstance; WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); WndClass.lpszMenuName = NULL; WndClass.lpszClassName = _T("Window Class Name"); RegisterClass(&WndClass); hwnd = CreateWindow(_T("Window Class Name"), _T("Main Window Title"), WS_OVERLAPPEDWINDOW, ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; HANDLE hFile; TCHAR InBuff[1000]; TCHAR OutBuff[100] = _T("파일을 테스트파일에 쓰기."); DWORD size; RECT rt; switch (iMsg) { case WM_CREATE: break; case WM_LBUTTONDOWN: hFile = CreateFile(_T("test1.txt"), GENERIC_READ | GENERIC_WRITE, memset(InBuff, 0, sizeof(InBuff)); ReadFile(hFile, InBuff, 999 * sizeof(TCHAR), &size, NULL); hdc = GetDC(hwnd); GetClientRect(hwnd, &rt); DrawText(hdc, InBuff, (int)_tcslen(InBuff), &rt, DT_TOP | DT_LEFT); ReleaseDC(hwnd, hdc); WriteFile(hFile, OutBuff, (DWORD)_tcslen(OutBuff) * sizeof(TCHAR), &size, NULL); CloseHandle(hFile); break; case WM_PAINT: break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, iMsg, wParam, lParam); } |
실행 결과]
공용 대화상자로 텍스트 파일 열기
#include <windows.h> #include <TCHAR.H> #include "resource.h" LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK ChildWndProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam); void ReadFromFile(int WndIndex, TCHAR filename[]); HWND hwndChild[100]; TCHAR WinBuff[100][1000]; int WndCount; HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { ... WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); . .. while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }
LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static HWND hwndClient; CLIENTCREATESTRUCT clientcreate; MDICREATESTRUCT mdicreate; static TCHAR filepath[1000], folder[100], filename[100]; TCHAR filter[] = _T("텍스트 파일 (*.txt)\0*.txt\0모든 파일 (*.*)\0*.*\0"); OPENFILENAME OFN;
switch (iMsg) { case WM_CREATE: clientcreate.hWindowMenu = GetSubMenu(GetMenu(hwnd), 0); clientcreate.idFirstChild = 100; hwndClient = CreateWindow( _T("MDICLIENT"), NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE, 0, 0, 0, 0, hwnd, NULL, hInst, (LPSTR)&clientcreate ); ShowWindow(hwndClient, SW_SHOW); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_FILEOPEN: memset(&OFN, 0, sizeof(OPENFILENAME)); OFN.lStructSize = sizeof(OPENFILENAME); OFN.hwndOwner = hwnd; OFN.lpstrFile = filepath; OFN.nMaxFileTitle = 100; OFN.lpstrFileTitle = filename; OFN.nMaxFile = 1000; OFN.lpstrFilter = filter; OFN.Flags = OFN_EXPLORER; GetOpenFileName(&OFN); WndCount++; ReadFromFile(WndCount, filepath); mdicreate.szClass = _T("Child Window Class Name"); mdicreate.szTitle = filepath; mdicreate.hOwner = hInst; mdicreate.x = CW_USEDEFAULT; mdicreate.y = CW_USEDEFAULT; mdicreate.cx = CW_USEDEFAULT; mdicreate.cy = CW_USEDEFAULT; mdicreate.style = 0; mdicreate.lParam = 0; hwndChild[WndCount] = (HWND)SendMessage(hwndClient, WM_MDICREATE, 0, (LPARAM)(LPMDICREATESTRUCT)&mdicreate); return 0; } break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefFrameProc(hwnd, hwndClient, iMsg, wParam, lParam); }
void ReadFromFile(int WndIndex, TCHAR filename[]) { HANDLE hFile; DWORD size = 1000; hFile = CreateFile( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); ReadFile(hFile, WinBuff[WndIndex], size * sizeof(TCHAR), &size, NULL); WinBuff[WndIndex][size] = NULL; CloseHandle(hFile); }
LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { int i, SelectWnd; HDC hdc; RECT rt; PAINTSTRUCT ps;
for (i = 1; i <= WndCount; i++) if (hwnd == hwndChild[i]) { SelectWnd = i; break; }
switch (iMsg) { case WM_CREATE: break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rt); DrawText(hdc, WinBuff[SelectWnd], (int)_tcslen(WinBuff[SelectWnd]), &rt, DT_TOP | DT_LEFT); EndPaint(hwnd, &ps); break; case WM_DESTROY: return 0; } return DefMDIChildProc(hwnd, iMsg, wParam, lParam); }
|
실행 결과]
여러개의 파일을 선택하여 열기
LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { ... static TCHAR filepath[1000], folder[100], filename[100]; LPTSTR pStr; TCHAR filter[] = _T("텍스트 파일 (*.txt)\0*.txt\0모든 파일 (*.*)\0*.*\0"); OPENFILENAME OFN;
switch (iMsg) { ... case WM_COMMAND: switch (LOWORD(wParam)) { case ID_FILEOPEN: memset(&OFN, 0, sizeof(OPENFILENAME)); OFN.lStructSize = sizeof(OPENFILENAME); OFN.hwndOwner = hwnd; OFN.lpstrFile = filepath; OFN.nMaxFileTitle = 100; OFN.lpstrFileTitle = filename; OFN.nMaxFile = 1000; OFN.lpstrFilter = filter; OFN.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT; GetOpenFileName(&OFN); pStr = filepath; if (!*pStr) break; _tcscpy_s(folder, pStr); pStr = pStr + _tcslen(pStr) + 1; if (!*pStr) { WndCount++; ReadFromFile(WndCount, filepath); mdicreate.szClass = _T("Child Window Class Name"); mdicreate.szTitle = folder; mdicreate.hOwner = hInst; mdicreate.x = CW_USEDEFAULT; mdicreate.y = CW_USEDEFAULT; mdicreate.cx = CW_USEDEFAULT; mdicreate.cy = CW_USEDEFAULT; mdicreate.style = 0; mdicreate.lParam = 0; hwndChild[WndCount] = (HWND)SendMessage(hwndClient, WM_MDICREATE, 0, (LPARAM)(LPMDICREATESTRUCT)&mdicreate); return 0; } while (*pStr) { _tcscpy_s(filename, pStr); pStr = pStr + _tcslen(pStr) + 1; WndCount++; ReadFromFile(WndCount, filename); mdicreate.szClass = _T("Child Window Class Name"); mdicreate.szTitle = filename; mdicreate.hOwner = hInst; mdicreate.x = CW_USEDEFAULT; mdicreate.y = CW_USEDEFAULT; mdicreate.cx = CW_USEDEFAULT; mdicreate.cy = CW_USEDEFAULT; mdicreate.style = 0; mdicreate.lParam = 0; hwndChild[WndCount] = (HWND)SendMessage(hwndClient, WM_MDICREATE, 0, (LPARAM)(LPMDICREATESTRUCT)&mdicreate); } } break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefFrameProc(hwnd, hwndClient, iMsg, wParam, lParam); } |
실행 결과]