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 コンストラクタは例外をスローしますが、Open は FALSE を返します。しかし、Open は、エラーを説明するために CFileException オブジェクトを初期化できます。パラメータ pError を指定しなかった場合、またはパラメータ pError に NULL を渡した場合は、Open は FALSE を返し、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