次の方法で共有


CFile::Open

更新 : 2007 年 11 月

Open 関数は、既定の CFile コンストラクタと合わせて使うようにデザインされています。

virtual BOOL Open(
   LPCTSTR lpszFileName,
   UINT nOpenFlags,
   CFileException* pError = NULL 
);

パラメータ

  • lpszFileName
    目的のファイルのパスを示す文字列。相対パス、絶対パス、またはネットワーク名 (UNC) を指定できます。

  • nOpenFlags
    ファイルの共有モードとアクセス モードを定義する UINT。このパラメータは、ファイルを開くときに実行するアクションを指定します。ビットごとの OR (|) 演算子を使ってオプションを組み合わせることができます。アクセス許可モードと共有モードは、それぞれ 1 つは指定する必要があります。modeCreate モードと modeNoInherit モードはオプションです。モード オプションの一覧については、CFile コンストラクタの説明を参照してください。

  • pError
    操作が失敗した場合にステータス情報を受け取るファイル例外オブジェクトへのポインタ。

戻り値

ファイルが正常に開いた場合は 0 以外を返します。それ以外の場合は 0 を返します。パラメータ pError は、0 が返されたときだけ使用されます。

解説

2 つの関数を使うと、ファイルを開くときに、失敗する可能性があっても "安全に" 操作できます。

エラーが発生した場合、CFile コンストラクタは例外をスローしますが、OpenFALSE を返します。しかし、Open は、エラーを説明するために CFileException オブジェクトを初期化できます。パラメータ pError を指定しなかった場合、またはパラメータ pError に NULL を渡した場合は、OpenFALSE を返し、CFileException はスローしません。既存の CFileException へのポインタを渡すと、エラーが発生した場合、Open 関数はエラーを説明する情報を補います。いずれにしても、Open が例外をスローすることはありません。

Open を呼び出した場合の結果を次の表で説明します。

pError

エラー発生の有無

戻り値

CFileException の内容

NULL

なし

TRUE

適用なし

CFileException へのポインタ

なし

TRUE

変更なし

NULL

あり

FALSE

適用なし

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;
}

必要条件

ヘッダー : afx.h

参照

参照

CFile クラス

階層図

CFile::CFile

CFile::Close

その他の技術情報

CFile のメンバ