본문 바로가기

프로그램언어/C++

파일 입출력1

파일만들기

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,
        CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    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,
                                 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0 );

        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);

             }
             return 0;

        }

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        return 0;

    }

    return DefFrameProc(hwnd, hwndClient, iMsg, wParam, lParam);

}

실행 결과]

 

'프로그램언어 > C++' 카테고리의 다른 글

윈도우 소켓1  (0) 2021.01.12
파일 입출력2  (0) 2021.01.11
컨트롤 윈도우 사용하기  (0) 2021.01.05
MID 프로그래밍  (0) 2021.01.03
대화상자4  (0) 2020.12.31