티스토리 뷰
CFile 클래스가 제공하는 핵심 I/O 연산
A. 파일을 열거나 생성 (Open)
B. 파일 포인터의 위치에서 데이터 읽기 (Read)
C. 파일 포인터의 위치에 데이터 쓰기 (Write)
D. 파일 퐁니터의 위치를 변경 (Seek)
E. 파일 닫기 (Close)
1. 열기와 생성
CFile 클래스의 생성자를 이용하여 파일을 열거나 생성하는 경우 생성자 리턴값이 없어 오류 처리가 안되므로 C++ 예외 처리 기법을 사용하여 처리한다.
1
2
3
4
5
6
7 |
try {
CFile file(L"mytest.txt", CFile::modeReadWrite);
}
catch (CFileException* e) {
e->ReportError();
e->Delete();
} |
cs |
CFile::Open() 를 이용하여 파일을 열거나 생성할때 리턴값으로 오류 처리하면 된다.
1
2
3
4 |
CFile file;
CFileException e;
if (!file.Open(L"mytest.txt", CFile::modeReadWrite, &e))
e.ReportError(); |
cs |
위 두 코드에서 에러가 나면 아래 그림과 같은 메시지 박스가 뜬다.
CFile::CFile("파일명", 접근및공유모드 플래그값)
CFile::Open("파일명", 접근및공유모드 플래그값, CFileException*)
<접근 및 공유 모드 플래그값>
플래그 |
의미 |
CFile::modeCreate |
파일을 무조건 생성, 같은 이름이 있는 경우 크기를 0으로 바꾼다. |
CFile::modeNoTruncate |
OR 연산자를 이용하여 CFile::modeCreate와 같이 사용하면 같은 이름을 가진 파일이 있는 경우 크기를 0으로 바꾸지 않고 이 파일을 연다. |
CFile::modeRead |
읽기전용 모드로 파일을 열거나 생성 |
CFile::modeReadWrite |
읽기와 쓰기 모드로 파일을 열거나 생성 |
CFile::modeWrite |
쓰기 전용 모드로 파일을 열거나 생성 |
CFile::shareDenyNone |
다른 프로세스에서 파일에 대한 읽기와 쓰기를 허용한다. |
CFile::shareDenyRead |
다른 프로세스에서 파일에 대한 읽기를 금지한다. |
CFile::shareDenyWrite |
다른 프로세스에서 파일에 대한 쓰기를 금지한다. |
CFile::shareDenyExclusive |
다른 프로세스에서 파일에 대한 읽기와 쓰기를 금지한다. |
2. 닫기
CFile 객체를 사용할 경우 이 객체가 소멸되면 자동으로 파일을 닫으므로 명시적으로 파일을 닫는 함수를 호출할 필요가 없다.
1
2
3
4
5
6
7
8
9
10
11 |
void CMFCApplication4View::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CFile file;
CFileException e;
if (!file.Open(L"mytest.txt", CFile::modeReadWrite | CFile::modeCreate, &e))
{
e.ReportError();
return;
}
CView::OnLButtonDblClk(nFlags, point);
} // CFile::~File() 함수가 호출된다. |
cs |
CFile::Close() 를 사용하면 명시적으로 파일을 닫을 수 있다. 이 방법은 하나의 CFile 객체를 이용하여 여러개의 파일을 다룰 때 유용하다.
1
2
3
4
5
6
7
8
9
10
11
12 |
void CMFCApplication4View::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CFile file;
CFileException e;
if (!file.Open(L"mytest.txt", CFile::modeReadWrite | CFile::modeCreate, &e))
{
e.ReportError();
return;
}
file.Close();
CView::OnLButtonDblClk(nFlags, point);
} |
cs |
3. 읽기와 쓰기
UINT CFile::Read(void* lpBuf, UINT nCount);
UINT CFile::Write(void* lpBuf, UINT nCount);
lpBuf : 버퍼의 주소
nCount : 전송할 바이트 수
Read()의 리턴값은 버퍼로 전송된 실제 바이트 수, 이 값은 nCount보다 작을 수 도 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
CFile file;
CFileException e;
CString str파일 = TEXT("C:\\DATA\\TEST\\test.txt");
if (!file.Open(str파일, CFile::modeReadWrite, &e))
{
e.ReportError();
return FALSE;
}
do
{
char pbufWrite[100] = { 0, };
dwCount = file.Read(pbufWrite, sizeof(pbufWrite));
str문자열.Append(pbufWrite, dwCount);
} while (dwCount > 0);
file.Close(); |
cs |
<주의> 2번 소스처럼 파일 속성에 CFile::modeCreate 부여하면 파일이 있어도 새로 만들므로 4행에서 속성을 읽기쓰기 만 지정해야 했다.4. fds
4. 파일 포인터 위치 변경
OS 에서 파일의 최대크기는 2^64 (16,777,216TB) 바이트이므로 파일 포인터의 위치는 64bit로 나타낸다.
CFile::Seek()는 파일 포인터를 임의의 위치로 옮기는 역활을 하는 함수
ULONGLONG CFile::Seek(LONGLONG lOff, UINT nFrom)
lOff : 부호있는64bit 값으로 이 크기만큼 파일 포인터를 이동한다.
경우에 따라서 음수가 될 수 도 있다. (어떤 경우?)
nFrom : 파일 퐁니터 이동 시 기준점
nFrom |
의미 |
CFile::begin |
파일의 처음 위치부터 lOff만큼 파일 포인터를 이동 |
CFile::current |
현재의 파일 포인터 위치부터 lOff만큼 파일 포인터를 이동 |
CFile::end |
파일의 끝 위치부터 lOff만큼 파일 포인터를 이동 |
5. 기타 함수
CFile::GetLength(), CFile::SetLength() : 파일의 현재 크기를 얻거나 변경
CFile::GetPosition() : 현재의 파일 포인터 위치를 얻는다.
CFile::LockRange(), CFile::UnlockRange() : 파일의 일정 영역을 잠그거나 해제.
잠근 영역은 다른 프로세스에서 접근 할 수 없다.
CFile::GetFilePath(), CFile::GetFileName() : 파일의 전체 경로(Full Path)와 이름을 얻는다.