Programming - cpueblo.com

MFC 에서 File 다루기


글쓴이 : 유광희 날짜 : 2002-05-13 (월) 21:29 조회 : 33579

MFC에서 File다루기[#1/3]
--------------------------------------------------------------------------------
게 시 자 : karma(임종문)
게 시 일 : 97/03/13 07:08:14
수 정 일 : 97/03/13 07:08:38
크    기 : 6.4K
조회횟수 : 1243

소개글; MFC에서 File을 다루는 것에 대해서는 books online을 보는 것 말고는 
        별로 없는데, 마침 천리안에 강좌가 있길래 허락을 받고 이 곳에 올립니다.
       (아마, 나우누리에도 있을 겁니다.)

제 목 : [강좌] MFC로 파일 처리를...
 
안녕하세요...
 
이번에 MFC를 이용한 파일제어에 대해서 강좌를 한번 써보려고 합니다.
강좌라고 하기가 좀 그렇네요. 거의 책을 보고 하는것이라.
파일제어에 관한 글이 별로 없는것 같아서 초보분들을 위해 글을 올려봅니
다. 그리고, 이 글은 MFC 4.0을 기준으로 한것입니다.
 
그럼 본론으로 들어갑니다...
 
 윈도우즈에서 파일 입출력에 대한 처리방법은 여러가지가 있는데, 가장 쉬
운방법은 MFC 클래스 라이브러리에서 기본적으로 제공되고 있는 표준 다이
얼로그 박스(Common Dialog Box)클래스를 이용하는 것입니다. 표준 다이얼
로그 박스는 문자열의 검색과 치환, 색상의 선택, 폰트의 선택, 프린팅에
대한 기능들도 표준 다이얼로그 박스 클래스로 제공되고 있기 때문에 이러
한 기능들을 프로그램에 지원하고자 할 때는 표준 다이얼로그 박스를 이용
하는 것이 훨씬 용이 합니다.
 Visual C++은 윈도우즈 상에서 보다 효율적으로 파일처리를 할 수 있도록
CFile 클래스와 직렬화(Serialization)기능을 제공하고 있습니다.
 
                                                                               
 
?CFile 클래스
 MFC는 표준 파일 처리를 위해 CFile 클래스를 제공하고 있습니다. 이 CFil
e 클래스에는 파일처리를 위한 많은 멤버함수들이 포함되어 있는데, 이러한
 함수들은 이전에 도스상에서 자주 다루어 보았던 함수들과 유사합니다.
 
┌────────┬───────────────────────┐
│    멤버함수    │                        의미                  │
├────────┼───────────────────────┤
│ CFile()        │객체 생성자.                                  │
│ Abort()        │모든 경고와 에러들을 무시하고 화일을 닫는다.  │
│ Duplicate()    │오브젝트 복사.                                │
│ Open()         │파일을 연다.                                  │
│ Close()        │파일 종료 및 오브젝트 삭제.                   │
│                │                                              │
│ Read()         │파일로 부터 데이타를 읽는다.                  │
│ Write()        │현재파일 위치에 데이타를 쓴다.                │
│ Flush()        │데이타를 제거한다.                            │
│                │                                              │
│ Seek()         │파일포인터를 이동한다.                        │
│ SeekToBegin()  │파일 포인터를 처음으로 이동한다.              │
│ SeekToEnd()    │파일 포인터를 끝으로 이동한다.                │
│ GetLength()    │파일의 길이를 얻는다.                         │
│ SetLength()    │파일의 길이를 지정한다.                       │
│                │                                              │
│ LockRange()    │파일의 일부를 락(Lock)을 건다.                │
│ UnlockRange()  │파일의 일부를 락에서 해제한다.                │
│                │                                              │
│ GetPosition()  │파일의 포인터를 얻는다.                       │
│ GetStatus()    │지정된 파일의 상태를 얻는다.                  │
│ GetFileName()  │선택된 파일의 파일이름을 얻는다.              │
│ GetFileTitle() │선택된 파일의 타이틀을 얻는다.                │
│ GetFilePath()  │선택된 파일의 전체 경로를 얻는다.             │
│ SetFilePath()  │선택된 파일의 전체 경로를 설정한다.           │
│                │                                              │
│ Rename()       │지정된 파일을 다른이름으로 변경한다.          │
│ Remove()       │지정된 파일을 제거한다.                       │
│ GetStatus()    │지정된 파일의 상태를 얻는다.                  │
│ SetStatus()    │지정된 파일의 상태를 설정한다.                │
└────────┴───────────────────────┘
 
 멤버함수들을 알았으니 CFile 클래스로 파일 쓰기와 파일 읽기 예제를 보
면서 공부해 보겠습니다.
 
?파일쓰기 예제

void CFileioView::OnWritefile()
{
    CFile Wfile;
    if(!Wfile.Open("TestFile.txt", CFile::modeCreate |
                     CFile::modeWrite))
    {
        MessageBox("Can't Create testfile.txt !", "Warning",
                        MB_OK | MB_ICONHAND);
        return;
    }
    char* ps = new char[27];
    char* ps2 = ps;
    for(int i=0;i<26;i++)
        *ps2++ = 'A'+i;
    *ps2 = NULL;    // NULL 문자로 끝나게 한다.
    Wfile.Write(ps,27);
    Wfile.Close();
    delete ps;
}
 
?파일읽기 예제
 
void CFileioView::OnReadfile()
{
    CFile Rfile;
    if(!Wfile.Open("TestFile.txt", CFile::modeRead))
    {
        MessageBox("Can't Open testfile.txt !", "Warning",
                        MB_OK | MB_ICONHAND);
        return;
    }
    UINT FileLength = (UINT)Rfile.GetLength();
    char* ps = new char[FileLength];
    Rfile.Read(ps,FileLength);
    Rfile.Close();
 
    CClientDC dc(this);
    dc.TextOut(0,0,ps,lstrlen(ps));
    delete ps;
}
 
 마지막으로 파일의 특정위치에 데이타를 읽거나 쓸수 있도록 처리해주는 C
File 클래스의 Seek()멤버함수를 이용해보겠습니다.
 
 
?랜덤 파일 처리 예제
 
void CFileioView::OnAddfile()
{
    CFile Afile;
    if(!Afile.Open("TestFile.txt", CFile::modeRead |
                     CFile::modeWrite))
    {
        MessageBox("Can't Create testfile.txt !", "Warning",
                        MB_OK | MB_ICONHAND);
        return;
    }
    Afile.Seek(-1,CFile::end);
    ~~~~~~~~~~~~~
    char* ps = new char[27];
    char* ps2 = ps;
    for(int i=0;i<26;i++)
        *ps2++ = 'a'+i;
    *ps2 = NULL;    // NULL 문자로 끝나게 한다.
    Wfile.Write(ps,27);
    Wfile.Close();
 
    delete ps;
}
 
 참고로 Seek()함수에 대해서 알아보겠습니다...
 
 Seek()함수의 첫번째 매개 변수는 양수이면 앞쪽으로 파일포인터를 이동하
고, 음수이면 뒷쪽으로 파일포인터를 이동합니다. 두번째 매개 변수는 파일
의 첫번째 위치를 기준으로 파일포인터를 이동하고자 하면 CFile:begin 플
래그를 사용하고, 현재위치나 파일의 마지막을 기준으로 이동하고자 한다면
 CFile::end 플래그를 사용하면 됩니다.
 CFile 클래스는 이 함수 외에도 SeekToBegin()와 SeekToEnd()함수를 제공
하고 있습니다.
 
 도움이 좀 되셨나 모르겠네요...
 그리고 참고서적을 안적을수가 없죠...
 참고서적은 MFC 프로그램 이렇게 시작하세요, 저자는 윤정균 입니다...
 Visual C++ 4.0의 도움말도 참고로 했습니다.
 제가 파일처리를 하기 위해서 여러 책을 뒤져봤지만, 이 책이 제일 잘 나
와있더군요. 좀더 자세히 알고 싶으신분들은 VC++의 도움말이나 이 책을 참
고로 하세요... ^_^
 다음 강좌에는 직렬화, 파일의 예외처리나 API만으로 파일 처리하는것을
알아보겠습니다.



MFC에서 File다루기[#2/3]
--------------------------------------------------------------------------------
게 시 자 : karma(임종문)
게 시 일 : 97/03/13 07:19:09
수 정 일 : 
크    기 : 3.2K
조회횟수 : 660

제 목 : [강좌] MFC로 파일처리를... #2(다시 올립니다..)
 
안녕하세요...
 
제가 좀 게을러서리... 이제야 글을 올리네요...
 
이번엔 파일의 예외처리에 대해서 알아보겠습니다...
 
⊙ 예외처리(Exception Handling)
 
 MFC는 파일예외처리를 위해서 CFileException 클래스를 제공하고 있습니다
CFileException 클래스는 파일을 오픈하면서 발생되는 여러가지 에러에 관
련된 정보를 포함하고 있습니다.
 파일처리에 있어서 발생되는 에러는 CFileException 클래스의 m_cause 데
이타 멤버의 값을 참조하게 됩니다. 파일 에러가 발생했을때 m_cause데이타
멤버에 발생된 에러코드가 들어가게 되는데, 이것들에는 다음과 같은 것들
이 있습니다.
 
? 에러코드
┌──────────┬──────────────────────┐
│none                │  에러가 없다                               │
│generic             │  일반적인 에러                             │
│fileNotFound        │  파일이 존재하지 않는다                    │
│badPath             │  파일 경로가 맞지 않다                     │
│tooManyOpenFiles    │  허용된 파일 오픈 수를 넘었다              │
│accessDenied        │  파일 접근 금지                            │
│invalidFile         │  파일에 이상이 있다                        │
│removeCurrentDir    │  현재 디렉토리를 제거할 수 없다            │
│directoryFull       │  디렉토리가 모두 찼다                      │
│badSeek             │  파일 포인터 지정에러                      │
│hardIO              │  하드웨어 에러                             │
│sharingViolation    │  SHARE.EXE가 로드되지 않았거나 공유된      │
│                    │   지역에 락이 걸렸을경우                   │
│lockViolation       │  이미 락이 걸려 있는 지역에 락을 시도 했다 │
│diskFull            │  디스크가 모두 찼다                        │
│endOfFile           │  파일의 끝에 도달하였다                    │
└──────────┴──────────────────────┘
 
 실행에러 즉, 예외처리를 하는 TRY, CATCH, END_CATCH 매크로가 사용됩니
다. 이들 매크로는 메모리(CMemoryException), 리소스(CResourceException)
, OLE(COleException)등에 관련된 예외처리를 담당합니다.
 
예>
 
     // example for CFileException::m_cause
     extern char* pFileName;
     TRY
     {
          CFile f(pFileName, CFile::modeCreate | CFile::modeWrite);
     }
     CATCH(CFileException, e)
     {
          if(e->m_cause == CFileException::fileNotFound)
 
               printf("ERROR : File not found\\n");
     }
 
 이번엔 switch ~ case 문으로 해볼까요?
 
     extern char* pFileName;
     TRY
     {
          CFile f(pFileName, CFile::modeCreate | CFile::modeWrite);
     }
     CATCH(CFileException, e)
     {
          switch(e->m_cause)
          {
               case CFileException::fileNotFound :
 
                    MessageBox("File not found");
                    break;
               case CFileException::diskFull :
 
                    MessageBox("Disk is full");
                    break;
                    :
                    :
          }
     }
     END_CATCH
 
 끝났습니다... 다음엔 API로 파일처리하는걸 올리겠습니다...
 도움이 많이 되셨길 바래요...
 
 참고서적: MFC 프로그램 이렇게 시작하세요... 저자:윤정균...
           Visual C++ Books Online 4.0...



MFC에서 File다루기(#3/3/)
--------------------------------------------------------------------------------
게 시 자 : karma(임종문)
게 시 일 : 97/03/13 07:20:36
수 정 일 : 
크    기 : 1.3K
조회횟수 : 644

제 목 : [강좌] MFC로 파일처리를... #3
 
안녕하세요... 이번엔 API만을 이용해서 파일을 처리해보겠습니다.
 
 
?파일을 열고 닫기
 
HANDLE hFile;
hFile = CreateFile("File.txt", GENERIC_READ | GENERIC_WRITE,
         FILE_SHARED_READ, NULL, OPEN_ALWAYS,
         FILE_ATTRIBUTE_NORMAL, NULL);
 
if(hFile != INVALID_HANDLE_VALUE)
{
     //파일을 사용한다.
 
     //파일을 닫는다.
     CloseHandle(hFile);
}
 
?파일을 읽거나 쓰기
 
HANDLE hFile;
hFile = CreateFile("File.txt", GENERIC_READ | GENERIC_WRITE,
         FILE_SHARED_READ, NULL, OPEN_ALWAYS,
         FILE_ATTRIBUTE_NORMAL, NULL);
 
if(hFile != INVALID_HANDLE_VALUE)
{
     DWORD dwActBytes;
     char szBuf[128];
 
     //''This is a sample" 문자열을 파일에 쓴다.
     WriteFile(hFile, "This is a sample", 17, &dwActBytes, NULL);
 
     //파일 포인터를 파일의 시작 위치로 옮긴다.
     SetFilePointer(hFile, 0, 0, FILE_BEGIN);
 
     //파일로부터 문자열을 읽어온다.
     ReadFile(hFile, szBuf, 128, &dwActBytes, NULL);
 
     //NULL로 끝나는 문자열.
     szBuf[dwActBytes] = 0;
     //파일을 닫는다.
     CloseHandle(hFile);
}
 
간단하죠? 우선 CreateFile()로 파일핸들을 hFile에 저장한뒤에
WriteFile()과 ReadFile()로 처리하는겁니다...
어렵지 않게 쓰실수 있을겁니다...
 
참고서적 : WIN32 PROGRAMMING API BIBLE 하권
 
도움이 되셨길...                         위니였어요...