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 ライブラリ リファレンス MFCFiles」および「File Handling」を参照してください。

継承階層

CObject

CFile

要件

ヘッダー: afx.h

CFile::Abort

このオブジェクトに関連付けられているファイルを閉じ、ファイルを読み取りまたは書き込みに使用できないようにします。

virtual void Abort();

解説

オブジェクトを破棄する前にファイルを閉じていない場合は、デストラクターによって閉じられます。

例外を処理する場合、 CFile::Abort は 2 つの重要な点で CFile::Close とは異なります。 最初に、 Abort 関数はエラー時に例外をスローしません。エラーは Abortによって無視されるためです。 第 2 に、ファイルが開いていないか、以前に閉じられている場合AbortはASSERT をしません。

newを使用してCFile オブジェクトをヒープに割り当てた場合は、ファイルを閉じた後に削除する必要があります。 Abortm_hFileCFile::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 であり、これは読み取り専用です。

Value 説明
CFile::modeRead 読み取りアクセスのみを要求します。
CFile::modeWrite 書き込みアクセスのみを要求します。
CFile::modeReadWrite 読み取りおよび書き込みアクセスを要求します。

次の文字モード オプションのいずれかを選択します。

Value 説明
CFile::typeBinary バイナリ モードを設定します (派生クラスのみで使用されます)。
CFile::typeText 復帰と改行のペア (派生クラスでのみ使用) の特別な処理を使用してテキスト モードを設定します。
CFile::typeUnicode Unicode モードを設定します (派生クラスのみで使用されます)。 アプリケーションが Unicode 構成でビルドされた場合、テキストは Unicode 形式でファイルに書き込まれます。 BOM はファイルに書き込まれません。

次のファイル共有モード オプションから 1 つのみ選択します。 既定のファイル共有モードは CFile::shareExclusive であり、これは排他的です。

Value 説明
CFile::shareDenyNone 共有の制限はありません。
CFile::shareDenyRead 他のすべての読み取りアクセスを拒否します。
CFile::shareDenyWrite 他のすべての書き込みアクセスを拒否します。
CFile::shareExclusive 他のすべての読み取りおよび書き込みアクセスを拒否します。

次のファイル作成モード オプションから最初のオプションまたは両方を選択します。 既定の作成モードは CFile::modeNoTruncate であり、これは既存を開くです。

Value 説明
CFile::modeCreate ファイルが存在しない場合は、新しいファイルを作成します。 ファイルが既に存在する場合は上書きされ、最初は長さが 0 に設定されます。
CFile::modeNoTruncate ファイルが存在しない場合は、新しいファイルを作成します。それ以外の場合、ファイルが既に存在する場合は、 CFile オブジェクトにアタッチされます。

説明に従って次のファイル キャッシュ オプションを選択します。 既定では、システムはオプションとして使用できない汎用キャッシュ スキームを使用します。

Value 説明
CFile::osNoBuffer システムは、ファイルの中間キャッシュを使用しません。 このオプションを選択すると、次の 2 つのオプションは取り消されます。
CFile::osRandomAccess ファイル キャッシュはランダム アクセスに対して最適化されます。 このオプションとシーケンシャル スキャン オプションの両方を使用しないでください。
CFile::osSequentialScan ファイル キャッシュは順次アクセスに対して最適化されます。 このオプションとランダム アクセス オプションの両方を使用しないでください。
CFile::osWriteThrough 書き込み操作は遅延なく実行されます。

ファイル ハンドルが継承されないようにするために、次のセキュリティ オプションを選択します。 既定では、新しい子プロセスはファイル ハンドルを使用できます。

Value 説明
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 オブジェクトをヒープに割り当てた場合は、ファイルを閉じた後に削除する必要があります。 Closem_hFileCFile::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 パラメーターに使用できる値を示します。

Value 説明
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 オブジェクトへのポインター。

解説

時刻を設定するには、statusm_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 クラス