Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

codingfarm

18. 파일 I/O와 디렉터리 컨트롤 - 작성중 본문

Windows/윈도우즈 시스템 프로그래밍

18. 파일 I/O와 디렉터리 컨트롤 - 작성중

scarecrow1992 2021. 5. 15. 00:44

1. 기본적인 파일 처리 함수들

  • Windows의 파일 입$\cdot$출력 함수는 ANI에서 정의하는것보다 방대한 내용을 담고 있다.
  • 이 포스팅에서 모든 내용을 담는것은 불가능하다. 보다 자세한 내용은 MSDN을 참조할것

 

CreateFile

1
2
3
4
5
6
7
8
9
HANDLE CreateFile(
 LPCTSTR               lpFileName,
  DWORD                 dwDesiredAccess,
  DWORD                 dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD                 dwCreationDisposition,
  DWORD                 dwFlagsAndAttributes,
  HANDLE                hTemplateFile
);
cs
인자 기능
LPCTSTR lpFileName ▶ open할 파일 이름
DWORD dwDesiredAccess  읽기/쓰기 모드를 지정
 or(|) 연산으로 결합 가능
  - GENERIC_READ : 읽기 모드 지정
  - GENERIC_WRITE : 쓰기 모드 지정
DWORD dwSharemode  파일 공유 방식을 지정
  - 0 : 다른 프로세스에 공유 불가, 이미 개방된 파일은 중복 개방 불가
  - FILE_SHARE_READ : 다른 프로세스에서 이 파일에 동시 읽기 접근 가능
  - FILE_SHARE_WRITE : 다른 프로세스에서 이 파일에 동시 쓰기 접근 가능. 단 동시에 같은 영역에 데이터를 쓰는 문제를 피해야함
LPSECURITY_ATTRIBUTES
lpSecurityAttributes
 보안 속성을 지정
  - 핸들을 자식 프로세스에게 상속할것인지 말것인지를 결정하기 위한 용도
  - NULL : default 보안 속성 지정
DWORD dwCreationDisposition 파일이 생성되는 방법을 지정
  - CREATE_ALWAYS : 항상 새 파일을 생성
  - CREATE_NEW : 새 파일을 생성, 파일이 없으면 생성 실패
  - OPEN_ALWAYS : 기존 파일 개방, 없으면 새로 생성
  - OPEN_EXISTING : 기존 파일 개방, 존재하지 않으면 함수 호출 실패
  - TRUNCATE_EXISTING : 기존 파일의 내용 지우고 개방, 파일이 없으면 호출 실패
DWORD dwFlagsAndAttributes  파일의 특성 정보를 설정
  - or(|) 연산으로 결합 가능
  - FILE_ATTRIBUTE_NORMAL : 특별한 특성을 지정하지 않는 보통 파일
자세한 내용은 추후 설명
HANDLE hTemplateFile 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들 때 사용되는 전달 인자
return value  파일의 핸들
  - 핸들을 통해 파일의 정보가 담긴 커널 오브제트에 접근할 수 있다.

 

 

CloseHandle

1
2
3
BOOL CloseHandle(
  HANDLE hObject
);
cs
  • 오브젝트 핸들을 종료하는 함수
  • 열린 파일을 종료하는데에도 쓰임

 

 

ReadFile

1
2
3
4
5
6
7
BOOL ReadFile(
  HANDLE       hFile,
  LPVOID       lpBuffer,
  DWORD        nNumberOfBytesToRead,
  LPDWORD      lpNumberOfBytesRead,
  LPOVERLAPPED lpOverlapped
);
cs
인자 기능
HANDLE    hFile 데이터를 읽을 파일의 핸들
LPVOID    lpBuffer 읽어들인 데이터를 저장할 버퍼(배열, 메모리)의 주소(포인터)
WORD    nNumberOfBytesToRead 파일로부터 읽고자 하는 데이터의 크기를 바이트 단위로 지정
LPDWORD    lpNumberOfBytesRead 실제 읽어 들인 데이터 크기를 얻기 위한 변수의 주소
LPOVERLAPPED    lpOverlapped 추후 설명
return value true  : 함수 호출 성공
false : 함수 호출 실패

 

 

WriteFile

1
2
3
4
5
6
7
BOOL WriteFile(
  HANDLE       hFile,
  LPCVOID      lpBuffer,
  DWORD        nNumberOfBytesToWrite,
  LPDWORD      lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped
);
cs
인자 기능
HANDLE       hFile 데이터를 저장할 파일의 핸들 지정
LPCVOID      lpBuffer 데이터를 저장하고 있는 버퍼(배열, 메모리)의 주소(포인터)
DWORD        nNumberOfBytesToWrite 파일에 저장하고자 하는 데이터 크기를 바이트 단위로 지정
LPDWORD      lpNumberOfBytesWritten 파일에 실제 저장된 데이터 크기를 얻기 위해 변수의 주소를 지정
LPOVERLAPPED lpOverlapped 추후 설명
return value  true  : 함수 호출 성공
 false : 함수 호출 실패

 

 

파일을 열어서 쓰고 닫는 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
 
int _tmain(int argc, TCHAR* argv[]) {
    TCHAR fileName[] = _T("data.txt");
    TCHAR fileData[] = _T("Just test string~");
 
    HANDLE hFile = CreateFile(
        fileName, GENERIC_WRITE, FILE_SHARE_WRITE,
        0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
    );
 
    if (hFile == INVALID_HANDLE_VALUE) {
        _tprintf(_T("File creation fault! \n"));
        return -1;
    }
 
    DWORD numOfByteWritten = 0;
    WriteFile(
        hFile, fileData, sizeof(fileData), &numOfByteWritten, NULL
    );
 
    _tprintf(_T("Written data size: %u \n"), numOfByteWritten);
    CloseHandle(hFile);
 
    return 0;
}
cs

data.txt 라는 파일을 새로 생성하여, Just test string~ 이라는 문자열을 파일에 쓰고 닫는 프로그램이다.

프로젝트 경로 내에 data 파일이 생성되었고, 해당 파일에 문자열이 저장되었음을 확인할 수 있다.

 

 

파일을 열어서 읽고 닫는 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
 
#define STRING_LEN    100
 
int _tmain(int argc, TCHAR* argv[]) {
    TCHAR fileName[] = _T("data.txt");
    TCHAR fileData[STRING_LEN];
 
    HANDLE hFile = CreateFile(
        fileName, GENERIC_READ, FILE_SHARE_READ,
        0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
    );
    if (hFile == INVALID_HANDLE_VALUE) {
        _tprintf(_T("File open fault! \n"));
        return -1;
    }
 
    DWORD numOfByteRead = 0;
    ReadFile(
        hFile, fileData, sizeof(fileData), &numOfByteRead, NULL
    );
    fileData[numOfByteRead / sizeof(TCHAR)] = 0;
 
    _tprintf(_T("Read data size: %u \n"), numOfByteRead);
    _tprintf(_T("Read string: %s \n"), fileData);
    CloseHandle(hFile);
    return 0;
}
cs

기존에 존재하는 data 파일 내의 문자열을 읽어서 콘솔에 출력하는 프로그램

CreateFile에 "OPEN_EXISTING" 속성이 부여되었으므로, 사전에 텍스트 파일을 옮겨놓아야 한다.

 

 

 

 

 

Comments