アプリ起動時に既定のファイルを読み込みたい – プログラミング – Home

アプリ起動時に既定のファイルを読み込み...
 
通知
すべてクリア

[解決済] アプリ起動時に既定のファイルを読み込みたい


カミーユ
 カミーユ
(@カミーユ)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

お世話になっています。
次のような仕様のなアプリを作っています。
・アプリと同じディレクトリにファイルhoge.txtがあれば、アプリ起動直後にファイルの内容
を読み込む。
・ファイルが存在しなければ空のhoge.txtを作成する。

一応は以下のコードで期待通り動作したのですが、
なんかインチキくさいやり方のようで気に入りません。
もっとスマートな方法があればご教授ください。

BOOL CMyApp::InitInstance()
{
//前略

// DDE、file open など標準のシェル コマンドのコマンドラインを解析します。
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen;
cmdInfo.m_strFileName = _T(hoge.txt);

CreateOrOpenDataFile();

// コマンドラインでディスパッチ コマンドを指定します。
if (!ProcessShellCommand(cmdInfo))
return FALSE;

//後略
}

void CMyApp::CreateOrOpenDataFile()
{
CFile file(_T(hoge.txt), CFile::modeCreate | CFile::modeNoTruncate);
}

開発環境は WinMe, VC++SP5 MFC(SDI)です。


引用未解決
トピックタグ
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

少なくとも、
> ・ファイルが存在しなければ空のhoge.txtを作成する。
に関していえば、カミーユさんの手法でいいと思います。

ただ、MSDNによると、
> CFile( LPCTSTR lpszFileName, UINT nOpenFlags )
> nOpenFlags
> 共有モードとアクセス モードを指定します。ファイルを開くときの動作です。
> ビットごとの OR (|) 演算子を使って、次のオプションを組み合わせます。
> アクセス許可モードと共有モードは必ず 1 つずつ指定します。
とあるので、フラグ指定が不足していると思います。

Windows98/VC++6.0sp5pro/SDK-may2002/ATL3.0/WTL7.0


返信引用
カミーユ
 カミーユ
(@カミーユ)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

>ただ、MSDNによると、
>> CFile( LPCTSTR lpszFileName, UINT nOpenFlags )
>> nOpenFlags
>> 共有モードとアクセス モードを指定します。ファイルを開くときの動作です。
>> ビットごとの OR (|) 演算子を使って、次のオプションを組み合わせます。
>> アクセス許可モードと共有モードは必ず 1 つずつ指定します。
>とあるので、フラグ指定が不足していると思います。

CFile::shareDenyWriteあたりも付け加えるべきなんでしょうが、
CMyApp::CreateOrOpenDataFile()を抜けるときに
CFileのデストラクタでファイルがクローズされ
さらに先のステップのCDocument::OnOpenDocumentで
CFile::modeRead|CFile::shareDenyWriteと指定して
ファイルをオープンしているので結果的にうまく動いているようです。


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

ファイルを作るだけという機能はなさそうなので、
上記の通り開いてすぐ閉じるとするしかないでしょうね。

しかし、あらかじめファイルを作っておかなくても、
CDocument::OnOpenDocument()でのファイルオープン時に、

CFile::modeRead|CFile::shareDenyWrite|
CFile::modeCreate|CFile::modeNoTruncate

とまとめて指定しておけば問題なさそうですが。
それとも、「後から別のファイルを読もうとしたときには、
存在しないファイルは作らない」というような追加仕様があるのでしょうか。


返信引用
カミーユ
 カミーユ
(@カミーユ)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

一応MFCのSDIで開発してますが、
開くファイルはhoge.txtひとつで固定していて
ファイルの新規作成や別のファイルを開く機能はありません。

ですので、dairygoodsさんの言われるとおり
CDocument::OnOpenDocumentをオーバーライドしたほうが
よさそうですね。

問題はアプリ起動時にCDocument::OnNewDocument()ではなく
CDocument::OnOpenDocument()を呼び出したいんです。

現在は
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen;
cmdInfo.m_strFileName = _T(hoge.txt);
としてますが、やはり本来はCWinApp::ParseCommandLineあたりを
オーバーライドするべきなんでしょうか?


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

> オーバーライドするべきなんでしょうか?

好みの問題のような気がしますが、
個人的には、起動時にあるファイルを自動的に開くというのは、
コマンドラインの解釈の仕組みを変更しているわけではないと思われるので、
CWinApp::ParseCommandLine()を上書きするのはヘンかなと思います。


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

>問題はアプリ起動時にCDocument::OnNewDocument()ではなく
>CDocument::OnOpenDocument()を呼び出したいんです。

最初に載せてあるソースの //前略 の部分でドキュメントテンプレートを生成して登録してい
ると思います。

CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
// 略
AddDocTemplate(pDocTemplate);

この後で、
pDocTemplate->OpenDocumentFile(hoge.txt);
という処理を入れると、CDocument::OnOpenDocument()を呼んでくれますが、これでは駄目で
すか?


返信引用
カミーユ
 カミーユ
(@カミーユ)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

saraさんの方法を試してみました。
結果は期待通り動作しました。

あとよく考えたらParseCommandLineメソッドを呼ぶ必要はないですね。
CCommandLineInfoのメンバ変数がpublicで公開されてるので

CCommandLineInfo cmdInfo;
cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen;
cmdInfo.m_strFileName = _T(hoge.txt);

// コマンドラインでディスパッチ コマンドを指定します。
if (!ProcessShellCommand(cmdInfo))
return FALSE;

というコードでもいいかな?という気がします。


返信引用
カミーユ
 カミーユ
(@カミーユ)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

皆さんに教えてもらった方法を
いろいろと検討してみたいと思います。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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