21
1/50 WIN32 API 스타일의 파일 입출력 학습목표 WIN32 API에서 제공하는 파일 입출력을 배운다. 참조: API programming. 이창현, 혜지원 업데이트: 2012. 11. 5 이종욱 추가 업데이터: 2015. 11. 6

8장. 파일 입출력 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/korea_sejong/leejonguk/12.pdf · 메모리로 직접 읽어 들이는 방식이므로 고수준보다

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

1/50

WIN32 API 스타일의

파일 입출력

학습목표 WIN32 API에서 제공하는 파일 입출력을 배운다.

참조: API programming. 이창현, 혜지원

업데이트: 2012. 11. 5 이종욱

추가 업데이터: 2015. 11. 6

2/50

SECTION 1. 입출력 라이브러리의 종류

• 입출력 라이브러리의 종류

1) C 런타임 입출력 라이브러리

- 고수준 파일 입출력 방식 : 고수준 입출력에서 파일의 데이터가 입출력되는 것을 스트림이라고 말

한다. 자동으로 스트림 내부에서 입출력을 처리해 주므로 개발자 스스로 버퍼를 생성하거나 관리할

필요가 없이, 데이터의 입출력 의사만 전달하면 알아서 처리한다.

- 저수준 파일 입출력 방식 : 저수준 파일 입출력 방식은 운영체제가 파일을 관리하는 방법과 동일하

다. 메모리로 직접 읽어 들이는 방식이므로 고수준보다 우수하며 속도가 빠르다.

2) C++ 입출력 라이브러리

C++ 라이브러리에서는 Ifstream, ofstream 등의 C++ 라이브러리의 파일 입출력 객체를 이용한다.

C 수준에서 파일 입출력을 할 수 있다면 사실상 입출력 과정에의 스트림이라는 면에서 똑같은 방법

으로 다룰 수 있다.

3/50

3) Win32 API 입출력 라이브러리

- Win32에서 제공되는 파일 입출력 라이브러리는 C 런타임 라이브러리의 입출력 함수

들로부터 파생되었으며, 사용 기능이나 함수명들이 거의 흡사하다. 하지만, Win32 API의

입출력 라이브러리가 기능에 있어서 훨씬 더 다양하다.

4) MFC 입출력 라이브러리

- MFC에서 제공되는 대표적인 파일 클래스로는 CFile 클래스와 CArchive 클래스를 들

수 있다. CFile 클래스는 MFC의 파일 클래스 중에서 최상위이며, 다양한 파일 제어 기능을

제공한다. CArchive 클래스는 직렬화(Serialization)라고도 하는데,

CDocument::Serialize 멤버 함수에서 사용되고 있다.

C언어 파일 입출력의 개요

파일 입출력을 할 때는, 먼저 스트림을 생성한 다음에 입출력을 수행해야

한다.

– 스트림을 생성하는 함수가 fopen 함수이다.

– 일단 파일을 연 다음에는 여러 가지 파일

입출력 함수를 이용해서 입출력 작업을

수행할 수 있다.

– 모든 입출력이 끝나면 fclose 함수로

파일을 닫아야 한다.

4

Win32 API 입출력 라이브러리

C 런타임 라이브러리의 입출력 함수들로부터 파생되어, 사용 기능이나 함

수 이름들이 유사하다. 하지만 기능들이 추가됨.

1. 파일생성 (1/3)

파일 생성 또는 open: CreateFile( )

– 파일 뿐 아니라 메모리나 포트와 같은 다양한 타입의 파일을 여는 것이 가능

5

1) lpFileName: 생성하고자 하는 파일명

– 파일의 경우 절대 경로 or 상대 경로 지정 모두 가능

2) dwDesiredAceess: 파일의 접근 권한을 지정한다

설정 값 내용

0 장치에 실제로 접근하지 않고도 장치의 속성을 조사할 수 있다.

GENERIC_READ 읽는 용도로 파일을 연다.

GENERIC_WRITE 쓰는 용도로 파일을 연다.

1. 파일생성 (2/3)

6

3) dwShareMode : 파일의 공유 모드를 지정한다.

4) lpSecurityAttributes : 파일의 보안 속성을 지정하는 구조체 포인터:

- 윈도우 NT 사용 권한자 모드 설정을 위해 사용.

5) dwCreationDisposition : 파일을 생성할 것인지 열 것인지 지정한다.

설정 값 내용

FILE_SHARE_READ 다른 프로세스가 읽기 접근 권한을 요청하면 허용한다.

FILE_SHARE_WRITE 다른 프로세스가 쓰기 접근 권한을 요청하면 허용한다.

FILE_SHARE_DELETE 삭제 접근 권한을 요청한 경우에만 허용한다.

설정 값 내용

CREATE_NEW 파일을 새로 만든다. 기존에 파일이 있다면 에러를 반환한다.

CREATE_ALWAYS 항상 파일을 새로 만든다. 만약 기존에 파일이 있다면 해당 파일에 덮어 쓴다.

OPEN_EXISTING 기존 파일을 연다. 만약 열려는 파일이 없다면 에러를 반환한다.

OPEN_ALWAYS 파일을 연다. 열려는 파일이 없을 경우에는 직접 파일을 생성하여 파일을 연다.

1. 파일생성 (3/3)

7

6) dwFlagsAndAttributes : 생성할 파일의 속성 또는 기타 객체의 속성을 지정한다.

7) hTemplateFile : 새로 만들 파일의 속성을 제공할 템플릿 파일이다.

설정 값 내용

FILE_ATTRUBUTE_ARCHIVE 쓰기 속성으로 생성한다.

FILE_ATTRUBUTE_ENCRYPTED 파일을 암호화하여 생성한다.

FILE_ATTRUBUTE_HIDDEN 숨김 파일로 생성한다.

FILE_ATTRUBUTE_NORMAL 아무런 속성도 없는 파일을 생성한다. 0

FILE_ATTRUBUTE_NOT_CONTENT_INDEXED 콘텐츠 인덱싱 서비스에 대해 인덱스되지 않도록 함.

FILE_ATTRUBUTE_OFFLINE 데이터가 오프라인 상태로 즉시 사용할 수 없다.

FILE_ATTRUBUTE_READONLY 읽기 전용 속성으로 생성한다.

FILE_ATTRUBUTE_SYSTEM 시스템 파일로 생성한다.

FILE_ATTRUBUTE_TEMPORARY 임시 파일로 생성한다.

2. 파일읽기 (1/1)

8

파일 읽기: ReadFile( )

– 파일로부터 데이터를 읽어온다

1) hFile: 읽으려는 파일의 핸들이다.

2) lpBuffer : 읽어 온 데이터를 저장할 버퍼의 포인터이다.

3) nNumberOfBytesToRead : 읽으려는 바이트 수이다.

4) lpNumberOfBytesRead : 실제로 읽은 바이트 수를 반환 받기 위한 출력용 인수이다.

5) lpOverlapped : 비동기 입출력을 위한 OVERLAPPED 구조체의 포인터(비동기 입출력을 사용

하지 않을 경우에는 NULL)이다.

3. 파일쓰기 (1/1)

9

파일 쓰기: WriteFile( )

– 파일로부터 데이터를 읽어온다

1) hFile: 쓰려는 파일의 핸들이다.

2) lpBuffer : 데이터를 쓰기 위해 할당된 버퍼의 포인터이다.

3) nNumberOfBytesToRead : 쓰려는 바이트 수이다.

4) lpNumberOfBytesRead : 실제로 쓴 바이트 수를 반환 받기 위한 출력용 인수이다.

5) lpOverlapped : 비동기 입출력을 위한 OVERLAPPED 구조체의 포인터(비동기 입출력을 사용

하지 않을 경우에는 NULL)이다.

SECTION 2. 파일 생성 및 쓰기 예제 (1/3)

1) File create_write 라는 이름의 프로젝트 생성.

2) File_write.cpp 생성 후 apistart.txt의 내용을 복사해서 추가함.

3) 다음 코드들을 추가한다.

// 코드 상단의 lpszClass 수정함!

1

10

SECTION 2. 실행 결과

윈도우에서 [마우스 왼쪽 버튼]을 클릭 해당 워킹 디렉토리에 [FileInOutEx.txt] 파일 생성됨

11

SECTION 2. 작업 디렉토리

• Working directory 확인: 프로그램에서 파일 읽기 및 쓰기를 위해, 기본적으로 사용하

는 디렉토리(폴더)

1) File create_write가 선택된 상황에서, Menu의 [Project Properties] 선택

2) 팝업창에서, [Debugging] 선택, “Local Windows Debugger”를 보면

3) Working Directory가 현재 프로젝트 디렉토리 &(ProjectDir) 임을 알 수 있다. 수정 가능

11

SECTION 2. 파일 생성 및 쓰기 예제 (2/3)

// WndProc( ) 변수 선언 부분에 다음 내용들 추가! 2

12

SECTION 2. 파일 생성 및 쓰기 예제 (3/3)

- CreateFile: 1,2) FileInOutEx.txt 파일을 현재 프로젝트 폴더에 쓰기 모드로 생성, 3) 0다른 프로세스와 공유 하지 않음,

4) NULL, 5) 항상 파일을 생성 하겠다, 6) 0속성 없음, 7) NULL

- Memcpy: 현재 파일에 쓸 문자열 맨 앞에 유니코드로 인식하게 하기 위한 0xFEFF가 저장된 wd 2byte 추가함

- WriteFile: 1) hFile에 의해 관리되는 FeleInOutEx.txt 파일에, 2) strWrite에 저장되어 있는 입력, 3) 입력할 문자열 길이,

4) 실제로 쓰여진 바이트 수를 리턴하기 위한 DWORD 변수의 포인터, 5) 비동기 입출력 하지 않을 때 NULL

- 실행 결과 윈도우 화면에서 마우스 왼쪽 클릭한 순간! 프로젝트 폴더 안에 FileInOutEx.txt 파일 생성된다. Txt 파일 확인!!!

3

13

SECTION 3. 파일 열기 및 읽기 예제 (1/3)

1) File open_read 라는 이름의 프로젝트 생성.

2) File_open.cpp 생성 후 기존 프로젝트 File create_write에 있던 cpp 코드의 내용을 복사해서 추가

3) 다음 코드들을 추가한다.

// 코드 상단의 lpszClass 수정함! 1

14

수행할 내용:

FileInOutEx.txt 파일의 사용할 수 있도록 연 후(open), 파일의 내용을 읽는다.(read)

읽은 내용을 윈도우에 출력!

SECTION 3. 파일 열기 및 읽기 예제 (2/3)

// WndProc( )의 변수 선언 부분에 파일 열기 및 읽기와 관련된 변수 추가! 2

15

SECTION 3. 파일 열기 및 읽기 예제 (3/3)

// WM_RBUTTONDOWN 메시지 처리 코드 추가! 3

- CreateFile: 1,2) FileInOutEx.txt 파일을 읽기 모드로 불러들임, 3) 0다른 프로세스와 공유하지않음,

4) NULL, 5) 이미 있는 파일을 불러온다, 6) 아무런 속성 없는 파일, 7) NULL

- ReadFile: hFile로 관리하고 있는 파일의 내용을 읽어서 strRead에 저장

- 실행 결과 윈도우 화면에서 마우스 오른쪽 클릭한 순간! 프로젝트 폴더 안의 txt 파일을 읽은 후,

해당 내용을 윈도우에 출력!

16

SECTION 4. 파일 공유 예제

파일 공유 문제: 멀티태스킹

하나의 파일을 여러 곳에서 동시에 접근 할 때, 이를 수용할 것인가? 아니면 막을 것

인가?

회원목록 파일을 A라는 사람이 사용 중인데,

동시에 B라는 사람이 접근하여 내용을 수정한다면?

해결 1) A가 사용이 끝날 때까지 B 접근 불허,

해결 2) B는 읽기만 가능하고 추후에 수정,

해결 3) 허용 가능하게 하고, 책임은 지지 않음

17

SECTION 4. 파일 공유 예제 (1/3)

1) File share 라는 이름의 프로젝트 생성.

2) File_share.cpp 생성 후 기존 프로젝트 File oepn_read의 cpp 코드의 내용을 복사해서 추가

3) 다음 코드들을 변경 및 추가한다.

// 코드 상단의 lpszClass 수정함! 1

17

SECTION 4. 파일 공유 예제 (2/3) // WM_RBUTTONDOWN과 WM_DESTROY 일부 변경: 공유 금지 2-1

1) 실행 후, 화면에서 왼쪽 마우스 클릭!

2) 오른쪽 마우스 클릭 후

3) 프로젝트 폴더에 있는 ‘FileInOutEx.txt’를 실행해본다!

결과) 오른쪽과 같은 ‘알림 창’이 나타날 것!

Why) CreateFile 3번째 인자가 0 파일 공유하지 않음 18

SECTION 4. 파일 공유 예제 (3/3)

2-2

CreateFile 3번째 인자를 0 FILE_SHARE_READ 로 변경함!!!

결과) 파일을 읽는 것은 가능하게 변함!!! 121

// WM_RBUTTONDOWN 일부 변경: 파일 읽기는 가능하게