일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- union find
- 이진탐색
- String
- two pointer
- 그래프
- Brute Force
- Trie
- 스토어드 프로시저
- 다익스트라
- Hash
- binary search
- Two Points
- Dijkstra
- SQL
- Stored Procedure
- MYSQL
- DP
Archives
- Today
- Total
codingfarm
18. 파일 I/O와 디렉터리 컨트롤 - 작성중 본문
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" 속성이 부여되었으므로, 사전에 텍스트 파일을 옮겨놓아야 한다.
'Windows > 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
7. 프로세스간 통신(IPC) 1 (0) | 2021.05.14 |
---|---|
6. 커널 오브젝트와 오브젝트 핸들 (0) | 2020.06.15 |
5. 프로세스의 생성과 소멸 (0) | 2020.06.15 |
4. 컴퓨터 구조에 대한 두 번째 이야기 (0) | 2020.05.29 |
2. 아스키코드와 유니코드 (0) | 2020.05.29 |
Comments