過去ログを参考にして、
既定のファイルがあったら通常にOpenし、
なかったら新規にファイルを作成し、Openする。
ということをやりたくCDocumentクラスの派生クラスで
以下のようなコードを書きました。
CDocument::OnOpenDocumentからの変更箇所は
一カ所だけです。
BOOL CXXXDocument::OnOpenDocument(LPCTSTR lpszPathName)
{
if (IsModified())
TRACE0(Warning: OnOpenDocument replaces an unsaved document.\n);
CFileException fe;
CFile* pFile = GetFile(lpszPathName,
CFile::modeCreate|CFile::modeNoTruncate //ここだけ変更
|CFile::modeRead|CFile::shareDenyWrite, &fe);
if (pFile == NULL)
{
ReportSaveLoadException(lpszPathName, &fe,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
return FALSE;
}
DeleteContents();
SetModifiedFlag(); // dirty during de-serialize
CArchive loadArchive(pFile, CArchive::load | CArchive::bNoFlushOnDelete);
loadArchive.m_pDocument = this;
loadArchive.m_bForceFlat = FALSE;
TRY
{
CWaitCursor wait;
if (pFile->GetLength() != 0)
Serialize(loadArchive); // load me
loadArchive.Close();
ReleaseFile(pFile, FALSE);
}
//以下略
上記のコードを実行するとファイルサイズが0より大きい
ファイルをオープンしているにもかかわらず
pFile->GetLength()の戻り値が0となってしまいます。
念のためCFile* pFile = GetFile()の直後に
pFile->SeekToBegin()を実行しても
結果は変わりませんでした。
何故GetLength()の戻り値が0になるか
ご教授ください。
以上、よろしくお願いします。
すいません。環境を書き忘れました。
Win98SE, VC++6.0SP5 MFC(SDI)
です。
CDocument::GetFile()のソースを見ると分かりますが、
この関数でCFile::modeCreateを指定してファイルを開く場合、
一時ファイルを作成して、そのファイルへのポインタを返します。
(閉じる時に本当のファイルに上書きします。)
CMirrorFile::Openもなんとかしないといけません。
ファイルが無いときは最初に作っておく方が楽かも、、、(^_^;
>ファイルが無いときは最初に作っておく方が楽かも、、、(^_^;
この方法で対処することにします。
MSDNにCMirrorFileって載ってないんですね・・・
ありがとうございました。
CMirrorFile::Openの中身を引用
> if (nOpenFlags & CFile::modeCreate) //opened for writing
条件文とコメントがあっていないような・・
GetFile,ReleaseFileの替りにpFile->Open,pFile->Close を使ったほうがよいかも?