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 とその派生クラス。 ディスク ファイルに送信される書式設定されたテキストに対して、またはその他の Microsoft iostream クラスを使用ofstreamします。

通常、ディスク ファイルは構築時に自動的に CFile 開き、破棄時に閉じられます。 静的メンバー関数を使用すると、ファイルを開かずにファイルの状態を問い合わすることができます。

使用CFileの詳細については、「MFC のファイル」および「ランタイム ライブラリ リファレンス」のファイル処理に関する記事を参照してください

継承階層

CObject

CFile

必要条件

ヘッダー: afx.h

CFile::Abort

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

virtual void Abort();

解説

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

例外を処理する場合、 CFile::Abort 2 つの重要な点とは CFile::Close 異なります。 まず、エラーが Abort 無視 Abortされるため、関数はエラー時に例外をスローしません。 次に、Abortファイルが開いていない場合、または以前に閉じられた場合は、AS Standard Edition RT は実行されません

ヒープにオブジェクトを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 パラメーターに使用できるオプションを示します。

次のファイル アクセス モード オプションから 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 オブジェクトへのポインターがスローされます。 例外を処理する方法の詳細については、「例外」を参照してください

オブジェクトが 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;

戻り値

重複 CFile するオブジェクトへのポインター。

解説

この関数は C ランタイム関数 _dupと同じです。

CFile::Flush

ファイル バッファー内のデータメインを強制的にファイルに書き込みます。

virtual void Flush();

解説

使用しても、バッファーのFlushCArchiveフラッシュは保証されません。 アーカイブを使用している場合は、最初に CArchive::Flush を呼び出します。

CFile::SetFilePath例を参照してください。

CFile::GetFileName

このメンバー関数を呼び出して、指定したファイルの名前を取得します。

virtual CString GetFileName() const;

戻り値

ファイルの名前。

解説

たとえば、ファイルに関c:\windows\write\myfile.wriするメッセージをユーザーに生成するために呼び出GetFileNameすと、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;

戻り値

指定したファイルの完全パス。

解説

たとえば、ファイルに関c:\windows\write\myfile.wriするメッセージをユーザーに生成するために呼び出GetFilePathすと、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。それ以外の場合は FAL Standard Edition。

解説

非静的バージョン GetStatus は、指定 CFile されたオブジェクトに関連付けられている開いているファイルの状態情報を取得します。 静的バージョンは GetStatus 、ファイルを実際に開かずに、特定のファイル パスからファイルの状態を取得します。 このバージョンは、ファイルの存在とアクセス権をテストするのに役立ちます。

構造体のメンバーは m_attributeCFileStatus ファイル属性セットを参照します。 このクラスは 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

この関数は、-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 ( | ) 演算子を使用して、オプションを組み合わせることができます。 1 つのアクセス許可と 1 つの共有オプションが必要です。とmodeCreatemodeNoInheritモードは省略可能です。 モード オプションの 一覧については、CFile コンストラクターを参照してください。

pError
失敗した操作の状態を受け取る既存のファイル例外オブジェクトへのポインター。

pTM
CAtlTransactionManager オブジェクトへのポインター。

戻り値

オープンが成功した場合は 0 以外。それ以外の場合は 0。 pError パラメーターは、0 が返された場合にのみ意味があります。

解説

2 つの Open 関数は、エラーが通常の予期される状態であるファイルを開く "安全な" メソッドです。

コンストラクターはCFileエラー条件で例外をスローしますが、Openエラー状態の場合は FAL Standard Edition を返します。 Openただし、CFileException オブジェクトを初期化してエラーを記述することはできます。 pError パラメーターを指定しない場合、または pErrorNULL を渡した場合は、 Open FAL Standard Edition を返し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

この演算子を使用して、ReadFileExGetFileTime などの関数にオブジェクトにハンドルCFileHANDLE渡します。

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 の場合、対応する状態項目は更新されません。 構造体の説明については、 GetStatus メンバー関数を CFileStatus 参照してください。

pTM
CAtlTransactionManager オブジェクトへのポインター。

解説

時刻を設定するには、状態のフィールドをm_mtime変更します

ファイルの属性のみを変更しようとして呼び出 SetStatusm_mtime を行い、ファイルの状態構造体のメンバーが 0 以外の場合、属性も影響を受ける可能性があります (タイム スタンプを変更すると、属性に副作用が生じる可能性があります)。 ファイルの属性のみを変更する場合は、最初にファイル状態構造体のメンバーを m_mtime 0 に設定し、次に 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

この関数は、-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::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::CFileCFile::Open の例も参照してください。

関連項目

MFC サンプル DRAWCLI
CObject クラス
階層図
CStdioFile クラス
CMemFile クラス