CFile 클래스

MFC 파일 클래스의 기본 클래스입니다.

구문

class CFile : public CObject

멤버

공용 생성자

속성 설명
CFile::CFile CFile 경로 또는 파일 핸들에서 개체를 생성합니다.

공용 메서드

이름 설명
CFile::Abort 모든 경고 및 오류를 무시하고 파일을 닫습니다.
CFile::Close 파일을 닫고 개체를 삭제합니다.
CFile::D uplicate 이 파일을 기반으로 중복 개체를 생성합니다.
CFile::Flush 아직 기록되지 않은 데이터를 플러시합니다.
CFile::GetFileName 선택한 파일의 파일 이름을 검색합니다.
CFile::GetFilePath 선택한 파일의 전체 파일 경로를 검색합니다.
CFile::GetFileTitle 선택한 파일의 제목을 검색합니다.
CFile::GetLength 파일의 길이를 검색합니다.
CFile::GetPosition 현재 파일 포인터를 검색합니다.
CFile::GetStatus 열려 있는 파일의 상태 검색하거나 정적 버전에서 지정된 파일(정적, 가상 함수)의 상태 검색합니다.
CFile::LockRange 파일에서 바이트 범위를 잠급니다.
CFile::Open 금고 오류 테스트 옵션을 사용하여 파일을 엽니다.
CFile::Read 현재 파일 위치에 있는 파일에서 데이터를 읽습니다(버퍼되지 않음).
CFile::Remove 지정된 파일(정적 함수)을 삭제합니다.
CFile::Rename 지정된 파일(정적 함수)의 이름을 바꿉니다.
CFile::Seek 현재 파일 포인터를 배치합니다.
CFile::SeekToBegin 현재 파일 포인터를 파일의 시작 부분에 배치합니다.
CFile::SeekToEnd 현재 파일 포인터를 파일 끝에 배치합니다.
CFile::SetFilePath 선택한 파일의 전체 파일 경로를 설정합니다.
CFile::SetLength 파일의 길이를 변경합니다.
CFile::SetStatus 지정된 파일의 상태 설정합니다(정적, 가상 함수).
CFile::UnlockRange 파일의 바이트 범위를 잠금 해제합니다.
CFile::Write 파일의 데이터를 현재 파일 위치에 씁니다(버퍼되지 않음).

Public 연산자

이름 설명
CFile::operator HANDLE 개체에 대한 핸들입니다 CFile .

공용 데이터 멤버

이름 설명
CFile::hFileNull 개체에 CFile 유효한 핸들이 있는지 여부를 확인합니다.
CFile::m_hFile 일반적으로 운영 체제 파일 핸들을 포함합니다.

보호된 데이터 멤버

이름 설명
CFile::m_pTM CAtlTransactionManager 개체에 대한 포인터입니다.

설명

버퍼되지 않은 이진 디스크 입력/출력 서비스를 직접 제공하며 파생 클래스를 통해 텍스트 파일 및 메모리 파일을 간접적으로 지원합니다. CFile 는 Microsoft Foundation 클래스 개체의 serialization을 지원하기 위해 클래스와 함께 CArchive 작동합니다.

이 클래스와 해당 파생 클래스 간의 계층 관계를 사용하면 프로그램이 다형 CFile 인터페이스를 통해 모든 파일 개체에서 작동할 수 있습니다. 예를 들어 메모리 파일은 디스크 파일처럼 동작합니다.

범용 디스크 I/O에 대한 사용 CFile 및 파생 클래스입니다. 디스크 파일로 전송된 서식이 지정된 텍스트에 사용하거나 기타 Microsoft iostream 클래스를 사용합니다ofstream.

일반적으로 디스크 파일은 생성 시 CFile 자동으로 열리고 소멸 시 닫힙니다. 정적 멤버 함수를 사용하면 파일을 열지 않고 파일의 상태 심문할 수 있습니다.

사용에 CFile대한 자세한 내용은 MFC파일 및 런타임 라이브러리 참조의 파일 처리를 참조하세요.

상속 계층 구조

CObject

CFile

요구 사항

헤더: afx.h

CFile::Abort

이 개체와 연결된 파일을 닫고 파일을 읽거나 쓸 수 없게 만듭니다.

virtual void Abort();

설명

개체를 삭제하기 전에 파일을 닫지 않은 경우 소멸자가 파일을 닫습니다.

예외 CFile::Abort 를 처리할 때는 두 가지 중요한 방법이 다릅니다 CFile::Close . 먼저 오류가 Abort 무시 Abort되기 때문에 함수는 실패에 대한 예외를 throw하지 않습니다. 둘째, Abort 파일이 열리지 않았거나 이전에 닫힌 경우 ASSERT하지 않습니다.

힙에 개체를 CFile 할당하는 데 사용한 new 경우 파일을 닫은 후 삭제해야 합니다. Abort 로 설정 m_hFile 됩니다 CFile::hFileNull.

예시

CStdioFile fileTest;
TCHAR* pszFileName = _T("Abort_File.dat");

// do stuff that may cause exceptions
CFileException ex;
if (!fileTest.Open(pszFileName, CFile::modeWrite, &ex))
{
   ex.ReportError();
   fileTest.Abort();   // close file safely and quietly
}

CFile::CFile

CFile 개체를 생성하고 초기화합니다.

CFile();
CFile(CAtlTransactionManager* pTM);
CFile(HANDLE hFile);

CFile(
LPCTSTR lpszFileName,
UINT nOpenFlags);

CFile(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CAtlTransactionManager* pTM);

매개 변수

hFile
CFile 개체에 연결할 파일의 핸들입니다.

lpszFileName
CFile 개체에 연결할 파일의 상대 또는 전체 경로입니다.

nOpenFlags
지정한 파일에 대한 파일 액세스 옵션의 비트 조합(OR)입니다. 사용 가능한 옵션은 설명 섹션을 참조하세요.

Ptm
CAtlTransactionManager 개체에 대한 포인터

설명

다음 5개 표에는 nOpenFlags 매개 변수에 대한 가능한 옵션이 나와 있습니다 .

다음 파일 액세스 모드 옵션 중 하나만 선택해야 합니다. 기본 파일 액세스 모드는 CFile::modeRead(읽기 전용)입니다.

설명
CFile::modeRead 읽기 권한만 요청합니다.
CFile::modeWrite 쓰기 권한만 요청합니다.
CFile::modeReadWrite 읽기 및 쓰기 권한을 요청합니다.

다음 문자 모드 옵션 중 하나를 선택합니다.

설명
CFile::typeBinary 이진 모드를 설정합니다(파생 클래스에만 사용됨).
CFile::typeText 캐리지 리턴 라인 피드 쌍에 대한 특수 처리가 있는 텍스트 모드를 설정합니다(파생 클래스에서만 사용됨).
CFile::typeUnicode 유니코드 모드를 설정합니다(파생 클래스에만 사용됨). 애플리케이션을 유니코드 구성에서 빌드할 때는 텍스트가 유니코드 형식으로 파일에 기록됩니다. BOM이 파일에 기록되지 않습니다.

다음 파일 공유 모드 옵션 중 하나만 선택해야 합니다. 기본 파일 공유 모드는 CFile::shareExclusive(단독)입니다.

설명
CFile::shareDenyNone 공유 제한이 없습니다.
CFile::shareDenyRead 다른 모든 사용자에 대해 읽기 권한을 거부합니다.
CFile::shareDenyWrite 다른 모든 사용자에 대해 쓰기 권한을 거부합니다.
CFile::shareExclusive 다른 모든 사용자에 대해 읽기 및 쓰기 권한을 거부합니다.

다음 파일 만들기 모드 옵션 중 첫 번째 옵션 또는 두 옵션을 모두 선택합니다. 기본 만들기 모드는 CFile::modeNoTruncate(기존 파일 열기)입니다.

설명
CFile::modeCreate 파일이 없는 경우 새 파일을 만듭니다. 파일이 이미 있는 경우 덮어쓰여지고 처음에는 길이가 0으로 설정됩니다.
CFile::modeNoTruncate 파일이 없으면 새 파일을 만듭니다. 그렇지 않으면 파일이 이미 있는 경우 개체에 CFile 연결됩니다.

설명에 따라 다음 파일 캐싱 옵션을 선택합니다. 기본적으로 시스템은 옵션으로 사용할 수 없는 범용 캐싱 체계를 사용합니다.

설명
CFile::osNoBuffer 시스템은 파일에 중간 캐시를 사용하지 않습니다. 이 옵션은 다음 2개 옵션을 취소합니다.
CFile::osRandomAccess 임의 액세스를 위해 파일 캐시가 최적화됩니다. 이 옵션과 순차적 검사 옵션을 모두 사용하지 마세요.
CFile::osSequentialScan 순차 액세스를 위해 파일 캐시가 최적화됩니다. 이 옵션과 임의 액세스 옵션을 모두 사용하지 마세요.
CFile::osWriteThrough 쓰기 작업은 지연 없이 수행됩니다.

파일 핸들이 상속되지 않도록 하려면 다음 보안 옵션을 선택합니다. 기본적으로 새 자식 프로세스는 파일 핸들을 사용할 수 있습니다.

설명
CFile::modeNoInherit 자식 프로세스가 파일 핸들을 사용하지 못하도록 차단합니다.

기본 생성자는 멤버를 초기화하지만 개체에 파일을 CFile 첨부하지는 않습니다. 이 생성자를 사용한 후 CFile::Open 메서드를 사용하여 파일을 열고 개체에 CFile 연결합니다.

매개 변수가 하나 포함된 생성자는 멤버를 초기화하고 기존 파일을 CFile 개체에 연결합니다.

매개 변수가 두 개 포함된 생성자는 멤버를 초기화하고 지정한 파일 열기를 시도합니다. 이 생성자가 지정한 파일을 정상적으로 열면 파일은 CFile 개체에 연결되고, 그렇지 않으면 이 생성자가 CInvalidArgException 개체에 대한 포인터를 throw합니다. 예외를 처리하는 방법에 대한 자세한 내용은 예외를 참조 하세요.

개체가 CFile 지정된 파일을 성공적으로 열면 개체가 제거될 때 CFile 이 파일이 자동으로 닫힙니다. 그렇지 않으면 개체에 더 이상 연결 CFile 되지 않은 후 명시적으로 파일을 닫아야 합니다.

예시

다음 코드에서는 CFile 사용 방법을 보여줍니다.

HANDLE hFile = CreateFile(_T("CFile_File.dat"),
   GENERIC_WRITE, FILE_SHARE_READ,
   NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
   AfxMessageBox(_T("Couldn't create the file!"));
}
else
{
   // Attach a CFile object to the handle we have.
   CFile myFile(hFile);

   static const TCHAR sz[] = _T("I love CFile!");

   // write string
   myFile.Write(sz, sizeof(sz));

   // We need to call Close() explicitly. Note that there's no need to 
   // call CloseHandle() on the handle returned by the API because 
   // Close() automatically calls CloseHandle() for us.
   myFile.Close();

CFile::Close

이 개체와 연결된 파일을 닫고 파일을 읽거나 쓸 수 없게 만듭니다.

virtual void Close();

설명

개체를 삭제하기 전에 파일을 닫지 않은 경우 소멸자가 파일을 닫습니다.

힙에 개체를 CFile 할당하는 데 사용한 new 경우 파일을 닫은 후 삭제해야 합니다. Close 로 설정 m_hFile 됩니다 CFile::hFileNull.

예시

CFile::CFile에 대한 예제를 참조하세요.

CFile::D uplicate

지정된 파일에 대해 중복 CFile 개체를 생성합니다.

virtual CFile* Duplicate() const;

Return Value

중복 CFile 개체에 대한 포인터입니다.

설명

이 함수는 C 런타임 함수 _dup와 동일합니다.

CFile::Flush

파일 버퍼의 모든 데이터를 다시 기본 파일에 쓰도록 합니다.

virtual void Flush();

설명

사용 Flush 은 버퍼의 CArchive 플러시를 보장하지 않습니다. 보관 파일을 사용하는 경우 먼저 CArchive::Flush를 호출합니다.

예시

CFile::SetFilePath에 대한 예제를 참조하세요.

CFile::GetFileName

이 멤버 함수를 호출하여 지정된 파일의 이름을 검색합니다.

virtual CString GetFileName() const;

Return Value

파일 이름입니다.

설명

예를 들어 사용자에게 파일, 파일 c:\windows\write\myfile.wri이름myfile.wri, 파일에 대한 메시지를 생성하기 위해 호출 GetFileName 하면 반환됩니다.

이름을 포함하여 파일의 전체 경로를 반환하려면 GetFilePath를 호출 합니다. 파일의 제목( myfile)을 반환하려면 GetFileTitle을 호출 합니다.

예시

이 코드 조각은 SYSTEM을 엽니다. WINDOWS 디렉터리의 INI 파일입니다. 이 예제를 발견하면 출력 아래에 표시된 대로 이름과 경로 및 제목이 출력됩니다.

try
{
   // try to open the file
   CFile sysFile(_T("C:\\WINDOWS\\SYSTEM.INI"), CFile::modeRead);

   // print out path name and title information
   _tprintf_s(_T("Path is : \"%s\"\n"),
      (LPCTSTR) sysFile.GetFilePath());
   _tprintf_s(_T("Name is : \"%s\"\n"),
      (LPCTSTR) sysFile.GetFileName());
   _tprintf_s(_T("Title is: \"%s\"\n"), 
      (LPCTSTR) sysFile.GetFileTitle());

   // close the file handle
   sysFile.Close();
}
catch (CFileException* pEx)
{
   // if an error occurs, just make a message box
   pEx->ReportError();
   pEx->Delete();
}

CFile::GetFilePath

이 멤버 함수를 호출하여 지정된 파일의 전체 경로를 검색합니다.

virtual CString GetFilePath() const;

Return Value

지정된 파일의 전체 경로입니다.

설명

예를 들어 사용자에게 파일에 대한 메시지를 생성하기 위해 호출 GetFilePath 하면 파일 c:\windows\write\myfile.wri경로 c:\windows\write\myfile.wri가 반환됩니다.

파일 이름만 반환하려면 GetFileNamemyfile.wri을 호출 합니다. 파일의 제목()myfile을 반환하려면 GetFileTitle을 호출 합니다.

예시

GetFileName에 대한 예제를 참조하세요.

CFile::GetFileTitle

이 멤버 함수를 호출하여 파일의 파일 제목(표시 이름)을 검색합니다.

virtual CString GetFileTitle() const;

Return Value

기본 파일의 제목입니다.

설명

이 메서드는 GetFileTitle을 호출하여 파일의 제목을 검색합니다. 성공하면 메서드는 시스템에서 사용자에게 파일 이름을 표시하는 데 사용할 문자열을 반환합니다. 그렇지 않으면 메서드가 PathFindFileName을 호출하여 기본 파일의 파일 이름(파일 확장명 포함)을 검색합니다. 즉, 파일 확장명은 항상 반환된 파일 제목 문자열에 포함되지 않습니다. 자세한 내용은 Windows SDK의 GetFileTitlePathFindFileName 을 참조하세요.

이름을 포함하여 파일의 전체 경로를 반환하려면 GetFilePath를 호출 합니다. 파일 이름만 반환하려면 GetFileName을 호출 합니다.

예시

GetFileName에 대한 예제를 참조하세요.

CFile::GetLength

파일의 현재 논리적 길이를 바이트 단위로 가져옵니다.

virtual ULONGLONG GetLength() const;

Return Value

파일의 길이입니다.

예시

CFile* pFile = NULL;
// Constructing a CFile object with this override may throw
// a CFile exception, and won't throw any other exceptions.
// Calling CString::Format() may throw a CMemoryException,
// so we have a catch block for such exceptions, too. Any
// other exception types this function throws will be
// routed to the calling function.
try
{
   pFile = new CFile(_T("C:\\WINDOWS\\SYSTEM.INI"),
      CFile::modeRead | CFile::shareDenyNone);
   ULONGLONG dwLength = pFile->GetLength();
   CString str;
   str.Format(_T("Your SYSTEM.INI file is %I64u bytes long."), dwLength);
   AfxMessageBox(str);
}
catch (CFileException* pEx)
{
   // Simply show an error message to the user.
   pEx->ReportError();
   pEx->Delete();
}
catch(CMemoryException* pEx)
{
   pEx->ReportError();
   pEx->Delete();
   // We can't recover from this memory exception, so we'll
   // just terminate the app without any cleanup. Normally,
   // an application should do everything it possibly can to
   // clean up properly and _not_ call AfxAbort().
   AfxAbort();
}

// If an exception occurs in the CFile constructor,
// the language will free the memory allocated by new
// and will not complete the assignment to pFile.
// Thus, our clean-up code needs to test for NULL.
if (pFile != NULL)
{
   pFile->Close();
   delete pFile;
}         

CFile::GetPosition

나중에 호출 Seek할 때 사용할 수 있는 파일 포인터의 현재 값을 가져옵니다.

virtual ULONGLONG GetPosition() const;

Return Value

파일 포인터입니다.

예시

CFile cfile;
cfile.Open(_T("Seek_File.dat"), CFile::modeCreate |
   CFile::modeReadWrite);
LONGLONG lOffset = 1000;
ULONGLONG lActual;
lActual = cfile.Seek(lOffset, CFile::begin);
ASSERT(cfile.GetPosition() == lActual);

CFile::GetStatus

이 메서드는 지정된 개체 인스턴스 또는 지정된 CFile 파일 경로와 관련된 상태 정보를 검색합니다.

BOOL GetStatus(CFileStatus& rStatus) const;

static BOOL PASCAL GetStatus(
    LPCTSTR lpszFileName,
    CFileStatus& rStatus,
    CAtlTransactionManager* pTM = NULL);

매개 변수

rStatus
상태 정보를 받을 사용자 제공 CFileStatus 구조체에 대한 참조입니다. 구조체 CFileStatus 에는 다음 필드가 있습니다.

  • CTime m_ctime 파일을 만든 날짜와 시간입니다.

  • CTime m_mtime 파일이 마지막으로 수정된 날짜와 시간입니다.

  • CTime m_atime 파일을 읽기 위해 마지막으로 액세스한 날짜와 시간입니다.

  • ULONGLONG m_size DIR 명령에서 보고한 파일의 논리적 크기(바이트)입니다.

  • BYTE m_attribute 파일의 특성 바이트입니다.

  • char m_szFullName[_MAX_PATH] Windows 문자 집합의 절대 파일 이름입니다.

lpszFileName
원하는 파일의 경로인 Windows 문자 집합의 문자열입니다. 경로는 상대 경로 또는 절대 경로이거나 네트워크 경로 이름을 포함할 수 있습니다.

Ptm
CAtlTransactionManager 개체에 대한 포인터

Return Value

지정한 파일에 대한 상태 정보를 성공적으로 가져오면 TRUE이고, 그렇지 않으면 FALSE입니다.

설명

비정적 버전은 GetStatus 지정된 CFile 개체와 연결된 열린 파일의 상태 정보를 검색합니다. 정적 버전은 GetStatus 실제로 파일을 열지 않고 지정된 파일 경로에서 파일 상태 가져옵니다. 이 버전은 파일의 존재 및 액세스 권한을 테스트하는 데 유용합니다.

구조체의 CFileStatus 멤버는 m_attribute 파일 특성 집합을 참조합니다. 이 클래스는 CFile 파일 특성을 기호적으로 지정할 수 있도록 특성 열거형 형식을 제공합니다.

enum Attribute {
    normal =    0x00,
    readOnly =  0x01,
    hidden =    0x02,
    system =    0x04,
    volume =    0x08,
    directory = 0x10,
    archive =   0x20
    };

예시

CFile cfile;
cfile.Open(_T("SetLength_File.dat"), CFile::modeCreate |
   CFile::modeReadWrite);
ULONGLONG dwNewLength = 10000;
cfile.SetLength(dwNewLength);
CFileStatus status;
if(cfile.GetStatus(status))    // virtual member function
{
   TRACE(_T("File size = %u\n"), status.m_size);
}
TCHAR* pszFileName = _T("SetLength_File.dat");
if(CFile::GetStatus(pszFileName, status))   // static function
{
   TRACE(_T("Full file name = %s\n"), status.m_szFullName);
}

CFile::hFileNull

개체에 유효한 CFile 파일 핸들이 있는지 확인합니다.

static AFX_DATA const HANDLE hFileNull;

설명

이 상수는 개체에 유효한 파일 핸들이 CFile 있는지 확인하는 데 사용됩니다.

다음 예제에서는 이 작업을 보여 줍니다.

if (myFile.m_hFile != CFile::hFileNull)
   ;//perform operations on the file
else
   ;//indicate the presence of an invalid handle         

CFile::LockRange

열려 있는 파일에서 바이트 범위를 잠그고 파일이 이미 잠겨 있는 경우 예외를 throw합니다.

virtual void LockRange(
    ULONGLONG dwPos,
    ULONGLONG dwCount);

매개 변수

dwPos
잠글 바이트 범위 시작 부분의 바이트 오프셋입니다.

dwCount
잠글 범위의 바이트 수입니다.

설명

파일의 바이트를 잠그면 다른 프로세스에서 해당 바이트에 액세스할 수 없습니다. 파일의 영역을 둘 이상 잠글 수 있지만 겹치는 영역은 허용되지 않습니다.

멤버 함수를 사용하여 영역의 잠금을 UnlockRange 해제하는 경우 바이트 범위는 이전에 잠긴 지역과 정확히 일치해야 합니다. 함수는 LockRange 인접한 지역을 병합하지 않습니다. 잠긴 두 지역이 인접한 경우 각 지역의 잠금을 별도로 해제해야 합니다.

참고 항목

이 함수는 -derived 클래스에 CMemFile사용할 수 없습니다.

예시

CFile cfile;
cfile.Open(_T("LockRange_File.dat"), CFile::modeCreate |
   CFile::modeReadWrite);
ULONGLONG dwPos = 10;
ULONGLONG dwCount = 100;
cfile.LockRange(dwPos, dwCount);

// do something with the file

cfile.UnlockRange(dwPos, dwCount);

CFile::m_hFile

열려 있는 파일에 대한 운영 체제 파일 핸들을 포함합니다.

HANDLE m_hFile;

설명

m_hFile 는 UINT 형식의 공용 변수입니다. 핸들이 CFile::hFileNull할당되지 않은 경우 운영 체제 독립적 빈 파일 표시기가 포함됩니다.

멤버의 m_hFile 의미는 파생 클래스에 따라 달라지므로 사용하지 않는 것이 좋습니다. m_hFile 는 클래스의 비포형 사용을 지원하기 위해 편의를 위해 공용 멤버로 만들어집니다.

CFile::m_pTM

CAtlTransactionManager 개체에 대한 포인터입니다.

CAtlTransactionManager* m_pTM;

설명

CFile::Open

오버로드됨. Open 는 기본 CFile 생성자와 함께 사용하도록 설계되었습니다.

virtual BOOL Open(
    LPCTSTR lpszFileName,
    UINT nOpenFlags,
    CFileException* pError = NULL);

virtual BOOL Open(
    LPCTSTR lpszFileName,
    UINT nOpenFlags,
    CAtlTransactionManager* pTM,
    CFileException* pError = NULL);

매개 변수

lpszFileName
원하는 파일의 경로를 포함하는 문자열입니다. 경로는 상대, 절대 또는 UNC(네트워크 이름)일 수 있습니다.

nOpenFlags
파일의 공유 및 액세스 모드를 정의하는 UINT입니다. 파일을 열 때 수행할 작업을 지정합니다. 비트 OR( | ) 연산자를 사용하여 옵션을 결합할 수 있습니다. 하나의 액세스 권한과 하나의 공유 옵션이 필요합니다. 및 modeCreatemodeNoInherit 모드는 선택 사항입니다. 모드 옵션 목록은 CFile 생성자를 참조하세요.

pError
실패한 작업의 상태 받을 기존 파일 예외 개체에 대한 포인터입니다.

Ptm
CAtlTransactionManager 개체에 대한 포인터

Return Value

열기에 성공하면 0이 아닌 값입니다. 그렇지 않으면 0입니다. pError 매개 변수는 0이 반환되는 경우에만 의미가 있습니다.

설명

Open 함수는 파일을 열기 위한 "안전한" 메서드입니다. 여기서 오류는 정상적인 예상 조건입니다.

CFile 생성자가 오류 조건에서 예외를 throw하는 동안 오류 조건에 Open 대해 FALSE를 반환합니다. Open에서는 CFileException 개체를 초기화하여 오류를 설명할 수 있습니다. pError 매개 변수를 제공하지 않거나 pErrorOpen에 대해 NULL을 전달하는 경우 FALSE를 반환하고 throwCFileException하지 않습니다. 기존 CFileException포인터에 포인터를 전달하고 Open 오류가 발생하면 함수는 해당 오류를 설명하는 정보로 채웁니다. Open 는 두 경우 모두 예외를 throw하지 않습니다.

다음 표에서는 가능한 결과를 설명합니다 Open.

pError 오류가 발생했습니다. 반환 값 CFileException 콘텐츠
NULL 아니요 TRUE 해당 없음
ptr to CFileException 아니요 TRUE 변경 안 됨
NULL FALSE 해당 없음
ptr to CFileException FALSE 오류를 설명하기 위해 초기화

예시

CFile f;
CFileException e;
TCHAR* pszFileName = _T("Open_File.dat");
if(!f.Open(pszFileName, CFile::modeCreate | CFile::modeWrite, &e))
{
   TRACE(_T("File could not be opened %d\n"), e.m_cause);
}

 

//A second example for CFile::Open.
//This function uses CFile to copy binary files.
bool BinaryFileCopy(LPCTSTR pszSource, LPCTSTR pszDest)
{
   // constructing these file objects doesn't open them
   CFile sourceFile;
   CFile destFile;

   // we'll use a CFileException object to get error information
   CFileException ex;

   // open the source file for reading
   if (!sourceFile.Open(pszSource,
      CFile::modeRead | CFile::shareDenyWrite, &ex))
   {
      // complain if an error happened
      // no need to delete the ex object

      TCHAR szError[1024];
      ex.GetErrorMessage(szError, 1024);
      _tprintf_s(_T("Couldn't open source file: %1024s"), szError);
      return false;
   }
   else
   {
      if (!destFile.Open(pszDest, CFile::modeWrite |
         CFile::shareExclusive | CFile::modeCreate, &ex))
      {
         TCHAR szError[1024];
         ex.GetErrorMessage(szError, 1024);
         _tprintf_s(_T("Couldn't open source file: %1024s"), szError);

         sourceFile.Close();
         return false;
      }

      BYTE buffer[4096];
      DWORD dwRead;

      // Read in 4096-byte blocks,
      // remember how many bytes were actually read,
      // and try to write that many out. This loop ends
      // when there are no more bytes to read.
      do
      {
         dwRead = sourceFile.Read(buffer, 4096);
         destFile.Write(buffer, dwRead);
      }
      while (dwRead > 0);

      // Close both files

      destFile.Close();
      sourceFile.Close();
   }

   return true;
}

CFile::operator HANDLE

이 연산자를 사용하여 개체에 CFile 대한 핸들을 ReadFileEx 및 GetFileTimeHANDLE같은 함수에 전달합니다.

operator HANDLE() const;

CFile::Read

개체와 연결된 CFile 파일에서 버퍼로 데이터를 읽습니다.

virtual UINT Read(
    void* lpBuf,
    UINT nCount);

매개 변수

lpBuf
파일에서 읽은 데이터를 받는 사용자 제공 버퍼에 대한 포인터입니다.

nCount
파일에서 읽을 최대 바이트 수입니다. 텍스트 모드 파일의 경우 캐리지 리턴 라인 피드 쌍은 단일 문자로 계산됩니다.

Return Value

버퍼로 전송된 바이트 수입니다. 모든 CFile 클래스의 경우 파일 끝에 도달한 경우 반환 값이 nCount보다 작을 수 있습니다.

예시

CFile cfile;
cfile.Open(_T("Write_File.dat"), CFile::modeCreate | 
   CFile::modeReadWrite);
char pbufWrite[100];
memset(pbufWrite, 'a', sizeof(pbufWrite));
cfile.Write(pbufWrite, 100);         
cfile.Flush();
cfile.SeekToBegin();
char pbufRead[100];
cfile.Read(pbufRead, sizeof(pbufRead));
ASSERT(0 == memcmp(pbufWrite, pbufRead, sizeof(pbufWrite)));

또 다른 예제는 CFile::Open을 참조 하세요.

CFile::Remove

이 정적 함수는 경로에 지정된 파일을 삭제합니다.

static void PASCAL Remove(
    LPCTSTR lpszFileName,
    CAtlTransactionManager* pTM = NULL);

매개 변수

lpszFileName
원하는 파일의 경로인 문자열입니다. 경로는 상대 또는 절대 경로일 수 있으며 네트워크 이름을 포함할 수 있습니다.

Ptm
CAtlTransactionManager 개체에 대한 포인터

설명

Remove 는 디렉터리를 제거하지 않습니다.

Remove 연결된 파일이 열려 있거나 파일을 제거할 수 없는 경우 멤버 함수가 예외를 throw합니다. 이 함수는 DEL 명령과 동일합니다.

예시

//example for CFile::Remove
TCHAR* pFileName = _T("Remove_File.dat");
try
{
   CFile::Remove(pFileName);
}
catch (CFileException* pEx)
{
   TRACE(_T("File %20s cannot be removed\n"), pFileName);
   pEx->Delete();
}

CFile::Rename

이 정적 함수는 지정된 파일의 이름을 바꿉니다.

static void PASCAL Rename(
    LPCTSTR lpszOldName,
    LPCTSTR lpszNewName,
    CAtlTransactionManager* pTM = NULL);

매개 변수

lpszOldName
이전 경로입니다.

lpszNewName
새 경로입니다.

Ptm
CAtlTransactionManager 개체에 대한 포인터

설명

디렉터리의 이름을 바꿀 수 없습니다. 이 함수는 REN 명령과 동일합니다.

예시

TCHAR* pOldName = _T("Oldname_File.dat");
TCHAR* pNewName = _T("Renamed_File.dat");

try
{
    CFile::Rename(pOldName, pNewName);
}
catch(CFileException* pEx )
{
    TRACE(_T("File %20s not found, cause = %d\n"), pOldName, 
       pEx->m_cause);
    pEx->Delete();
}

CFile::Seek

열려 있는 파일의 파일 포인터 위치를 변경합니다.

virtual ULONGLONG Seek(
LONGLONG lOff,
UINT nFrom);

매개 변수

lOff
파일 포인터를 이동할 바이트 수입니다. 양수 값은 파일 포인터를 파일 끝으로 이동합니다. 음수 값은 파일 포인터를 파일의 시작 쪽으로 이동합니다.

nFrom
찾을 위치입니다. 가능한 값은 설명 섹션을 참조하세요.

Return Value

메서드가 성공한 경우 파일 포인터의 위치입니다. 그렇지 않으면 반환 값이 정의되지 않고 예외에 대한 포인터가 CFileException throw됩니다.

설명

다음 표에서는 nFrom 매개 변수에 사용할 수 있는 값을 나열합니다.

설명
CFile::begin 파일의 시작 부분부터 찾습니다.
CFile::current 파일 포인터의 현재 위치에서 검색합니다.
CFile::end 파일의 끝에서 검색합니다.

파일을 열면 파일 포인터가 파일의 시작 부분인 0에 배치됩니다.

파일 포인터를 파일 끝의 위치로 설정할 수 있습니다. 이렇게 하면 파일에 쓸 때까지 파일의 크기가 증가하지 않습니다.

이 메서드의 예외 처리기는 예외가 처리된 후 예외 개체를 삭제해야 합니다.

예시

CFile cfile;
cfile.Open(_T("Seek_File.dat"), CFile::modeCreate |
   CFile::modeReadWrite);
LONGLONG lOffset = 1000;
ULONGLONG lActual;
lActual = cfile.Seek(lOffset, CFile::begin);

CFile::SeekToBegin

파일 포인터의 값을 파일의 시작 부분으로 설정합니다.

void SeekToBegin();

설명

SeekToBegin()Seek( 0L, CFile::begin )와 같습니다.

예시

CFile f;
f.Open(_T("Seeker_File.dat"), CFile::modeCreate |
   CFile::modeReadWrite);
f.SeekToBegin();
ULONGLONG ullEnd = f.SeekToEnd();

CFile::SeekToEnd

파일 포인터의 값을 파일의 논리적 끝으로 설정합니다.

ULONGLONG SeekToEnd();

Return Value

파일 길이(바이트)입니다.

설명

SeekToEnd()CFile::Seek( 0L, CFile::end )와 같습니다.

예시

CFile f;
f.Open(_T("Seeker_File.dat"), CFile::modeCreate |
   CFile::modeReadWrite);
f.SeekToBegin();
ULONGLONG ullEnd = f.SeekToEnd();

CFile::SetFilePath

이 함수를 호출하여 파일의 경로를 지정합니다. 예를 들어 CFile 개체를 생성할 때 파일의 경로를 사용할 수 없는 경우 호출 SetFilePath 하여 제공합니다.

virtual void SetFilePath(LPCTSTR lpszNewName);

매개 변수

lpszNewName
새 경로를 지정하는 문자열에 대한 포인터입니다.

설명

참고 항목

SetFilePath 파일을 열거나 파일을 만들지 않습니다. 개체를 CFile 경로 이름과 연결하기만 하면 됩니다. 이 이름을 사용하면 됩니다.

예시

TCHAR* pstrName = _T("C:\\test\\SetPath_File.dat");

// open a file
HANDLE hFile = ::CreateFile(pstrName, GENERIC_WRITE, FILE_SHARE_READ,
   NULL, CREATE_ALWAYS, 0, NULL);

if (hFile != INVALID_HANDLE_VALUE)
{
   // attach a CFile object to it
   CFile myFile(hFile);

   // At this point, myFile doesn't know the path name for the file
   // it owns because Windows doesn't associate that information
   // with the handle. Any CFileExceptions thrown by this object
   // won't have complete information.

   // Calling SetFilePath() remedies that problem by letting CFile
   // know the name of the file that's associated with the object.

   myFile.SetFilePath(pstrName);

   // write something to the file and flush it immediately
   DWORD dwValue = 1234;
   myFile.Write(&dwValue, sizeof(dwValue));
   myFile.Flush();

   // destroying the CObject here will call ::CloseHandle() on the file
} 

CFile::SetLength

파일의 길이를 변경하려면 이 함수를 호출합니다.

virtual void SetLength(ULONGLONG dwNewLen);

매개 변수

dwNewLen
원하는 파일 길이(바이트)입니다. 이 값은 파일의 현재 길이보다 크거나 작을 수 있습니다. 파일이 적절하게 확장되거나 잘립니다.

설명

참고 항목

이 함수는 CMemFile개체를 throw할 수 있습니다 CMemoryException .

예시

CFile cfile;
cfile.Open(_T("SetLength_File.dat"), CFile::modeCreate |
   CFile::modeReadWrite);
ULONGLONG dwNewLength = 10000;
cfile.SetLength(dwNewLength);

CFile::SetStatus

이 파일 위치와 연결된 파일의 상태 설정합니다.

static void PASCAL SetStatus(
    LPCTSTR lpszFileName,
    const CFileStatus& status,
    CAtlTransactionManager* pTM = NULL);

매개 변수

lpszFileName
원하는 파일의 경로인 문자열입니다. 경로는 상대 또는 절대 경로일 수 있으며 네트워크 이름을 포함할 수 있습니다.

status
새 상태 정보를 포함하는 버퍼입니다. 멤버 함수를 GetStatus 호출하여 현재 값으로 구조를 미리 채한 CFileStatus 다음 필요에 따라 변경합니다. 값이 0이면 해당 상태 항목이 업데이트되지 않습니다. 구조에 대한 설명은 GetStatus 멤버 함수를 참조하세요 CFileStatus .

Ptm
CAtlTransactionManager 개체에 대한 포인터

설명

시간을 설정하려면 상태 필드를 수정 m_mtime 합니다.

파일의 특성만 변경하려고 호출 SetStatus 하고 m_mtime 파일 상태 구조체의 멤버가 0이 아닌 경우 특성도 영향을 받을 수 있습니다(타임스탬프를 변경하면 특성에 부작용이 있을 수 있음). 파일의 특성만 변경하려면 먼저 파일 상태 구조체의 멤버를 0으로 설정한 m_mtime 다음 호출합니다SetStatus.

예시

TCHAR* pFileName = _T("ReadOnly_File.dat");
CFileStatus status;
CFile::GetStatus(pFileName, status);
status.m_attribute |= CFile::readOnly;
CFile::SetStatus(pFileName, status);         

CFile::UnlockRange

열려 있는 파일에서 바이트 범위를 잠금 해제합니다.

virtual void UnlockRange(
    ULONGLONG dwPos,
    ULONGLONG dwCount);

매개 변수

dwPos
잠금을 해제할 바이트 범위 시작 부분의 바이트 오프셋입니다.

dwCount
잠금을 해제할 범위의 바이트 수입니다.

설명

자세한 내용은 LockRange 멤버 함수에 대한 설명을 참조하세요.

참고 항목

파생 클래스에는 이 함수를 CMemFile사용할 수 없습니다.

예시

CFile cfile;
cfile.Open(_T("LockRange_File.dat"), CFile::modeCreate |
   CFile::modeReadWrite);
ULONGLONG dwPos = 10;
ULONGLONG dwCount = 100;
cfile.LockRange(dwPos, dwCount);

// do something with the file

cfile.UnlockRange(dwPos, dwCount);

CFile::Write

버퍼의 데이터를 개체와 CFile 연결된 파일에 씁니다.

virtual void Write(
    const void* lpBuf,
    UINT nCount);

매개 변수

lpBuf
파일에 쓸 데이터를 포함하는 사용자가 제공한 버퍼에 대한 포인터입니다.

nCount
버퍼에서 전송할 바이트 수입니다. 텍스트 모드 파일의 경우 캐리지 리턴 라인 피드 쌍은 단일 문자로 계산됩니다.

설명

Write 는 디스크 전체 조건을 포함하여 여러 조건에 대한 응답으로 예외를 throw합니다.

예시

CFile cfile;
cfile.Open(_T("Write_File.dat"), CFile::modeCreate | 
   CFile::modeReadWrite);
char pbufWrite[100];
memset(pbufWrite, 'a', sizeof(pbufWrite));
cfile.Write(pbufWrite, 100);         
cfile.Flush();

CFile::CFile 및 CFile::Open에 대한 예제도 참조하세요.

참고 항목

MFC 샘플 DRAWCLI
CObject 클래스
계층 구조 차트
CStdioFile 클래스
CMemFile 클래스