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. 작업 디렉토리
• Working directory 확인: 프로그램에서 파일 읽기 및 쓰기를 위해, 기본적으로 사용하
는 디렉토리(폴더)
1) File create_write가 선택된 상황에서, Menu의 [Project Properties] 선택
2) 팝업창에서, [Debugging] 선택, “Local Windows Debugger”를 보면
3) Working Directory가 현재 프로젝트 디렉토리 &(ProjectDir) 임을 알 수 있다. 수정 가능
11
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. 파일 열기 및 읽기 예제 (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