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 | ファイル内のデータを現在のファイル位置に書き込みます (バッファーなし)。 |
パブリック演算子
名前 | 説明 |
---|---|
CFile::operator HANDLE | CFile オブジェクトへのハンドル。 |
パブリック データ メンバー
名前 | 説明 |
---|---|
CFile::hFileNull | CFile オブジェクトに有効なハンドルがあるかどうかを判断します。 |
CFile::m_hFile | 通常、オペレーティング システムのファイル ハンドルが含まれています。 |
プロテクト データ メンバー
名前 | 説明 |
---|---|
CFile::m_pTM | CAtlTransactionManager オブジェクトへのポインター。 |
解説
バッファーなしのバイナリ ディスク入出力サービスを直接提供し、派生クラスを介してテキスト ファイルとメモリ ファイルを間接的にサポートします。 CFile
は、microsoft Foundation Class オブジェクトのシリアル化をサポートするために、 CArchive
クラスと連携して機能します。
このクラスとその派生クラスの階層関係により、プログラムはポリモーフィックな CFile
インターフェイスを介してすべてのファイル オブジェクトを操作できます。 たとえば、メモリ ファイルはディスク ファイルのように動作します。
汎用ディスク I/O には、 CFile
とその派生クラスを使用します。 ディスク ファイルに送信される書式設定されたテキストには、 ofstream
またはその他の Microsoft iostream
クラスを使用します。
通常、ディスク ファイルは CFile
構築時に自動的に開き、破棄時に閉じられます。 静的メンバー関数を使用すると、ファイルを開かずにファイルの状態を問い合わすることができます。
CFile
の使用方法の詳細については、「Run-Time ライブラリ リファレンス MFC のFiles」および「File Handling」を参照してください。
継承階層
CFile
要件
ヘッダー: afx.h
CFile::Abort
このオブジェクトに関連付けられているファイルを閉じ、ファイルを読み取りまたは書き込みに使用できないようにします。
virtual void Abort();
解説
オブジェクトを破棄する前にファイルを閉じていない場合は、デストラクターによって閉じられます。
例外を処理する場合、 CFile::Abort
は 2 つの重要な点で CFile::Close
とは異なります。 最初に、 Abort
関数はエラー時に例外をスローしません。エラーは Abort
によって無視されるためです。 第 2 に、ファイルが開いていないか、以前に閉じられている場合Abort
はASSERT をしません。
new
を使用してCFile
オブジェクトをヒープに割り当てた場合は、ファイルを閉じた後に削除する必要があります。 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 パラメーターに使用できるオプションを示します。
次のファイル アクセス モード オプションから 1 つのみ選択します。 既定のファイル アクセス モードは CFile::modeRead
であり、これは読み取り専用です。
値 | 説明 |
---|---|
CFile::modeRead |
読み取りアクセスのみを要求します。 |
CFile::modeWrite |
書き込みアクセスのみを要求します。 |
CFile::modeReadWrite |
読み取りおよび書き込みアクセスを要求します。 |
次の文字モード オプションのいずれかを選択します。
値 | 説明 |
---|---|
CFile::typeBinary |
バイナリ モードを設定します (派生クラスのみで使用されます)。 |
CFile::typeText |
復帰と改行のペア (派生クラスでのみ使用) の特別な処理を使用してテキスト モードを設定します。 |
CFile::typeUnicode |
Unicode モードを設定します (派生クラスのみで使用されます)。 アプリケーションが Unicode 構成でビルドされた場合、テキストは Unicode 形式でファイルに書き込まれます。 BOM はファイルに書き込まれません。 |
次のファイル共有モード オプションから 1 つのみ選択します。 既定のファイル共有モードは 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
オブジェクトにアタッチします。
1 つのパラメーターを持つコンストラクターでは、メンバーは初期化され、既存のファイルが CFile
オブジェクトにアタッチされます。
2 つのパラメーターを持つコンストラクターでは、メンバーは初期化され、指定されたファイルを開くことが試行されます。 このコンストラクターによって、指定されたファイルが正常に開かれると、ファイルは CFile
オブジェクトにアタッチされます。それ以外の場合は、このコンストラクターによって CInvalidArgException
オブジェクトへのポインターがスローされます。 例外の処理方法の詳細については、「 Exceptions」を参照してください。
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();
解説
オブジェクトを破棄する前にファイルを閉じていない場合は、デストラクターによって閉じられます。
new
を使用してCFile
オブジェクトをヒープに割り当てた場合は、ファイルを閉じた後に削除する必要があります。 Close
m_hFile
をCFile::hFileNull
に設定します。
例
CFile::CFile の例を参照してください。
CFile::D uplicate
特定のファイルの重複する CFile
オブジェクトを作成します。
virtual CFile* Duplicate() const;
戻り値
重複する CFile
オブジェクトへのポインター。
解説
この関数は、C ランタイム関数の _dup
に相当します。
CFile::Flush
ファイル バッファーに残っているデータを強制的にファイルに書き込みます。
virtual void Flush();
解説
Flush
を使用しても、CArchive
バッファーのフラッシュは保証されません。 アーカイブを使用している場合は、最初に CArchive::Flush を呼び出します。
例
CFile::SetFilePath の例を参照してください。
CFile::GetFileName
このメンバー関数を呼び出して、指定したファイルの名前を取得します。
virtual CString GetFileName() const;
戻り値
ファイルの名前。
解説
たとえば、 GetFileName
を呼び出してファイル c:\windows\write\myfile.wri
に関するメッセージをユーザーに生成すると、ファイル名 myfile.wri
が返されます。
名前を含むファイルのパス全体を返すには、 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;
戻り値
指定したファイルの完全パス。
解説
たとえば、 GetFilePath
を呼び出してファイル c:\windows\write\myfile.wri
に関するメッセージをユーザーに生成すると、ファイル パス c:\windows\write\myfile.wri
が返されます。
ファイルの名前 (myfile.wri
) のみを返すには、 GetFileName を呼び出します。 ファイル (myfile
) のタイトルを取得するには、 GetFileTitle を呼び出します。
例
GetFileName の例を参照してください。
CFile::GetFileTitle
このメンバー関数を呼び出して、ファイルのファイル タイトル (表示名) を取得します。
virtual CString GetFileTitle() const;
戻り値
基になるファイルのタイトル。
解説
このメソッドは、 GetFileTitle を呼び出して、ファイルのタイトルを取得します。 成功した場合、メソッドは、システムがユーザーにファイル名を表示するために使用する文字列を返します。 それ以外の場合、メソッドは PathFindFileName を呼び出して、基になるファイルのファイル名 (ファイル拡張子を含む) を取得します。 つまり、ファイル拡張子は、返されるファイル タイトル文字列に必ずしも含まれていないことを意味します。 詳細については、Windows SDK の「 GetFileTitle および PathFindFileName を参照してください。
名前を含むファイルのパス全体を返すには、 GetFilePath を呼び出します。 ファイルの名前だけを返すには、 GetFileName を呼び出します。
例
GetFileName の例を参照してください。
CFile::GetLength
ファイルの現在の論理長をバイト単位で取得します。
virtual ULONGLONG GetLength() const;
戻り値
ファイルの長さ。
例
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;
戻り値
ファイル ポインター。
例
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 オブジェクトへのポインター。
戻り値
指定したファイルの状態情報が正常に取得された場合は TRUE。それ以外の場合は FALSE。
解説
非静的バージョンの GetStatus
は、指定された CFile
オブジェクトに関連付けられている開いているファイルの状態情報を取得します。 静的バージョンの GetStatus
は、ファイルを実際に開かずに、特定のファイル パスからファイルの状態を取得します。 このバージョンは、ファイルの存在とアクセス権をテストするのに役立ちます。
CFileStatus
構造体のm_attribute
メンバーは、ファイル属性セットを参照します。 CFile
クラスは Attribute 列挙型を提供するため、ファイル属性をシンボリックに指定できます。
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
開いているファイル内のバイト範囲をロックし、ファイルが既にロックされている場合は例外をスローします。
virtual void LockRange(
ULONGLONG dwPos,
ULONGLONG dwCount);
パラメーター
dwPos
ロックするバイト範囲の先頭のバイト オフセット。
dwCount
ロックする範囲内のバイト数。
解説
ファイル内のバイトをロックすると、他のプロセスがそれらのバイトにアクセスできなくなります。 ファイルの複数の領域をロックできますが、領域を重複させることはできません。
UnlockRange
メンバー関数を使用して領域のロックを解除する場合、バイト範囲は以前にロックされていた領域と正確に対応している必要があります。 LockRange
関数は隣接する領域をマージしません。 2 つのロックされたリージョンが隣接している場合は、各リージョンのロックを個別に解除する必要があります。
Note
この関数は、 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 ( |
) 演算子を使用して、オプションを組み合わせることができます。 1 つのアクセス許可と 1 つの共有オプションが必要です。 modeCreate
モードと modeNoInherit
モードは省略可能です。 モード オプションの一覧については、 CFile コンストラクターを参照してください。
pError
失敗した操作の状態を受け取る既存のファイル例外オブジェクトへのポインター。
pTM
CAtlTransactionManager オブジェクトへのポインター。
戻り値
オープンが成功した場合は 0 以外。それ以外の場合は 0。 pError パラメーターは、0 が返された場合にのみ意味があります。
解説
2 つの Open
関数は、エラーが通常の予期される状態であるファイルを開く "安全な" メソッドです。
CFile
コンストラクターはエラー条件で例外をスローしますが、エラー条件の場合は Open
は FALSE を返します。 Open
ただし、 CFileException オブジェクトを初期化してエラーを記述することはできます。 pError パラメーターを指定しない場合、または pError に NULL を渡した場合、Open
は FALSE を返し、CFileException
をスローしません。 既存の CFileException
へのポインターを渡し、エラーが発生 Open
場合、関数はそのエラーを説明する情報を入力します。 Open
どちらの場合も例外はスローされません。
次の表では、 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
オブジェクトへのハンドルを、HANDLE
を必要とする ReadFileEx GetFileTime などの関数に渡します。
operator HANDLE() const;
CFile::Read
CFile
オブジェクトに関連付けられているファイルからバッファーにデータを読み取ります。
virtual UINT Read(
void* lpBuf,
UINT nCount);
パラメーター
lpBuf
ファイルから読み取られたデータを受信する、ユーザー指定のバッファーへのポインター。
nCount
ファイルから読み取る最大バイト数。 テキスト モード ファイルの場合、復帰改行のペアは 1 文字としてカウントされます。
戻り値
バッファーに転送するバイト数。 すべての 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
メンバー関数は、接続されているファイルが開いている場合、またはファイルを削除できない場合に例外をスローします。 この関数は 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
シークする位置。 可能な値については、「備考」セクションを参照してください。
戻り値
メソッドが成功した場合のファイル ポインターの位置。それ以外の場合、戻り値は未定義であり、 CFileException
例外へのポインターがスローされます。
解説
次の表に、 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();
戻り値
ファイルの長さをバイト単位で返します。
解説
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
新しいパスを指定する文字列へのポインター。
解説
Note
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
ファイルの必要な長さ (バイト単位)。 この値は、ファイルの現在の長さよりも大きいか小さくすることができます。 ファイルは、必要に応じて拡張または切り捨てられます。
解説
Note
CMemFile
では、この関数は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 の場合、対応する状態項目は更新されません。 CFileStatus
構造体の説明については、GetStatus メンバー関数を参照してください。
pTM
CAtlTransactionManager オブジェクトへのポインター。
解説
時刻を設定するには、status のm_mtime
フィールドを変更します。
ファイルの属性のみを変更しようとして SetStatus
の呼び出しを行い、ファイルステータス構造の m_mtime
メンバーが 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 メンバー関数の説明を参照してください。
Note
この関数は、 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
バッファーから転送されるバイト数。 テキスト モード ファイルの場合、復帰改行のペアは 1 文字としてカウントされます。
解説
Write
は、ディスクがいっぱいの状態など、いくつかの条件に応答して例外をスローします。
例
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 クラス