CFIle::Openの使用説明

4844 ワード

CFIIEクラスはMFCのファイルクラスのベースクラスであり、バッファレスのバイナリディスクI/Oデバイスを直接提供し、その派生クラスを通じてtextファイルとメモリファイルへのアクセスを提供することができる.CFILEはCArchiveクラスとともにMFCシーケンス化のサポートを提供する.CFILEクラスとその派生クラスの間の等級関係は、あなたのプログラムが多態のCFILEインタフェースを通じてすべてのファイルクラスを操作することを許可します.メモリファイルやディスクファイルなど、似たようなものがあります.CFILEとその派生クラスは、一般的なディスクI/O操作を実行するために使用されます.OFSTREAMまたは他のマイクロソフトiostreamクラスは、フォーマットtextをディスクファイルに出力するために使用されます.通常、CFILEクラスの構築中にディスクファイルが自動的に開き、構造関数ではファイルが自動的に閉じます.ファイルを開くことなく、静的メンバー関数を使用してファイルのステータスを尋ねることができます.CFILEクラスを使用するには#includeを含める必要があります.
CFile::Open
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定義ファイルのアクセス共有モードです.ファイルが開くときに実行できるアクションを指定します.「|」を使用して、複数のオプションを組み合わせます.ファイルのアクセス権と共有オプションは指定する必要があります.modeCreateとmodeNoInheritはオプションです.具体的には、次のとおりです.
次の5つの表は、nOpenFlagsパラメータの可能なオプションを示しています.
次のファイル・アクセス・モード・オプションのいずれかのみを選択します.デフォルトのファイルアクセスモードはCFIle::modeReadで、読み取り専用モードです.

説明
CFile::modeRead
読み取りアクセスのみを要求します.
CFile::modeWrite
書き込みアクセスのみを要求します.
CFile::modeReadWrite
読み取り/書き込みアクセス権を要求します.
次のいずれかの文字モードオプションを選択します.

説明
CFile::typeBinary
派生クラスでのみ使用される二元モードを設定します.
CFile::typeText
テキストモードは、リターン-改行ペアを特殊に処理することで設定します(派生クラスでのみ使用されます).
CFile::typeUnicode
Unicodeモードを設定します(派生クラスでのみ使用).アプリケーションがUnicode構成で生成されると、テキストはUnicode形式でファイルに書き込まれます.BOMはファイルに書き込まれません.
次のファイル共有モードオプションのいずれかのみを選択します.デフォルトのファイル共有モードはCFIle::shareExclusiveで、このモードは排他モードです.

説明
CFile::shareDenyNone
共有の制限はありません.
CFile::shareDenyRead
他のすべてのユーザーへの読み取りアクセスを拒否します.
CFile::shareDenyWrite
他のすべてのユーザーへの書き込みアクセスを拒否します.
CFile::shareExclusive
他のすべてのユーザーへの読み書きアクセスを拒否します.
次の最初の(またはすべて選択)ファイル作成モードオプションを選択します.デフォルトの作成モードはCFIle::modeNoTruncateです.このモードは現在開いています.

説明
CFile::modeCreate
ファイルが存在しない場合は、新しいファイルを作成します.ファイルが既に存在する場合、CFIleExceptionが開始されます.
CFile::modeNoTruncate
ファイルが存在しない場合は、新しいファイルを作成します.それ以外の場合、ファイルが既に存在する場合はCFIleオブジェクトに添付します.
説明に従って、次のファイルキャッシュオプションを選択します.デフォルトでは、オプションとして使用できない汎用キャッシュ・スキームが使用されます.

説明
CFile::osNoBuffer
システムはファイルに中間キャッシュを使用していません.このオプションは、次の2つのオプションをキャンセルします.
CFile::osRandomAccess
ファイルキャッシュはランダムアクセスに最適化されています.このオプションとシーケンススキャンオプションは使用しないでください.
CFile::osSequentialScan
ファイルキャッシュは、シーケンスアクセスに最適化されています.このオプションとランダムアクセスオプションは使用しないでください.
CFile::osWriteThrough
書き込みを直ちに実行します.
次のセキュリティオプションを選択して、ファイルハンドルを継承しないようにします.デフォルトでは、すべての新しいサブプロセスでファイルハンドルを使用できます.

説明
CFile::modeNoInherit
サブプロセスがファイルハンドルを使用することを阻止します.
prerror:失敗した操作状態の既存ファイル異常オブジェクトを受信するポインタ.
pTM:CAtlTransactionManagerオブジェクトのポインタ
 
戻り値:
ゼロでない場合は、正常に開きます.それ以外の場合は0です.0を返すだけで、prerrorパラメータは意味があります.
 
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
"), 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;
}