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의 파일 및 런타임 라이브러리 참조의 파일 처리를 참조하세요.
상속 계층 구조
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의 GetFileTitle 및 PathFindFileName 을 참조하세요.
이름을 포함하여 파일의 전체 경로를 반환하려면 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( |
) 연산자를 사용하여 옵션을 결합할 수 있습니다. 하나의 액세스 권한과 하나의 공유 옵션이 필요합니다. 및 modeCreate
modeNoInherit
모드는 선택 사항입니다. 모드 옵션 목록은 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 클래스