CFile::GetLength()==0になってしまうのは何故? – プログラミング – Home

通知
すべてクリア

[解決済] CFile::GetLength()==0になってしまうのは何故?


小悪魔恭子
 小悪魔恭子
(@小悪魔恭子)
ゲスト
結合: 22年前
投稿: 25
Topic starter  

過去ログを参考にして、
既定のファイルがあったら通常に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になるか
ご教授ください。

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


引用未解決
トピックタグ
小悪魔恭子
 小悪魔恭子
(@小悪魔恭子)
ゲスト
結合: 22年前
投稿: 25
Topic starter  

すいません。環境を書き忘れました。
Win98SE, VC++6.0SP5 MFC(SDI)
です。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 22年前
投稿: 178
 

 CMirrorFile::Openもなんとかしないといけません。
 ファイルが無いときは最初に作っておく方が楽かも、、、(^_^;


返信引用
小悪魔恭子
 小悪魔恭子
(@小悪魔恭子)
ゲスト
結合: 22年前
投稿: 25
Topic starter  

>ファイルが無いときは最初に作っておく方が楽かも、、、(^_^;
この方法で対処することにします。

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

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


返信引用
REE
 REE
(@REE)
ゲスト
結合: 24年前
投稿: 240
 

CMirrorFile::Openの中身を引用

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました