CFile::GetLength()==0になってしまうのは何故?

[戻る]
小悪魔恭子 2003/02/11(火) 22:25:16
過去ログを参考にして、
既定のファイルがあったら通常に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になるか
ご教授ください。

以上、よろしくお願いします。

小悪魔恭子 2003/02/11(火) 22:34:16
すいません。環境を書き忘れました。
Win98SE, VC++6.0SP5 MFC(SDI)
です。

dairygoods 2003/02/12(水) 10:17:44
CDocument::GetFile()のソースを見ると分かりますが、
この関数でCFile::modeCreateを指定してファイルを開く場合、
一時ファイルを作成して、そのファイルへのポインタを返します。
(閉じる時に本当のファイルに上書きします。)

NEG(ねぐ) [E-Mail] [HomePage] 2003/02/12(水) 10:26:02
 CMirrorFile::Openもなんとかしないといけません。
 ファイルが無いときは最初に作っておく方が楽かも、、、(^_^;

小悪魔恭子 2003/02/12(水) 10:46:19
[[解決]]
>ファイルが無いときは最初に作っておく方が楽かも、、、(^_^;
この方法で対処することにします。

MSDNにCMirrorFileって載ってないんですね・・・

ありがとうございました。

REE 2003/02/12(水) 10:51:06
CMirrorFile::Openの中身を引用

> if (nOpenFlags & CFile::modeCreate) //opened for writing

条件文とコメントがあっていないような・・
GetFile,ReleaseFileの替りにpFile->Open,pFile->Close を使ったほうがよいかも?

古いスレッドには追加発言できません。