- ベストアンサー
【VC++6.0(MFC)】ファイルがアクセス中か確認したい
いつも大変お世話になっています。 VC++初心者です。 あるファイル(ファイル名はCString型)が 他からアクセスされているか(今回の場合、書き込み中か) 確認したい場合はどのようにしたら宜しいでしょうか。 お手数ですが、よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、file.Close()は不要ですね。 (あってはいけないわけではありませんが...) CFileのデストラクタでファイルを閉じてくれるからです。 "資源管理はコンストラクタ"と呼ばれC++の基本テクニックの一つです。 メモリやファイルハンドルなどの"資源"はコンストラクタで確保し、 デストラクタで廃棄するようにします。 (MFCのCFileはそういう風になっています) するとClose()を呼ぶ必要はなくなります。 さらに、これを発展させて例外処理で対応することも可能です try { CFile f(csFilePath, CFile::modeRead | CFile::shareDenyWrite); MessageBox(NULL,"アクセスできます。","アクセスOK",MB_OK); } catch (CException* e) { e->ReportError() e->Delete(); } こんな感じです。 ReportError()でMFC標準のエラーメッセージが出ます。 これがわかりずらい場合には、独自のメッセージを出すこともできます。 詳細はCFileExceptionを調査してください。 上記の例外処理の場合、 他からアクセスされている場合も、IOエラーの場合も同様に扱われます (エラーメッセージは異なります) これがいいかどうかは、議論のあるところだと思います。 私個人としては”使い方による"と考えます。 例えば、使用中の場合は適当な時間待って、リトライを行う 場合には、例外で通知するよりも Openで調査するほうが適切に思われます。
その他の回答 (1)
- BLK314
- ベストアンサー率55% (84/152)
単純にOpen()すれば良いのでは? MFCだからCFile::Open()でCFile::shareDenyWrite()を指定すれば 書き込み中の場合はOpen()失敗となって検出できます。
お礼
ご回答ありがとうございます。 C言語はある程度分かっているものの、VC、C++はまだまだ不慣れです。 以下のようにコーディングしましたが、如何でしょうか。 もし宜しければ、コメント頂けると幸いです。 (見やすくするため、全角スペースを入れています。) ***************************** CFile file; CString csFilePath; if (!file.Open(csFilePath, CFile::modeRead | CFile::shareDenyWrite)){ MessageBox(NULL,"誰かが書き込んでいます。","書き込み中",MB_OK); } else{ MessageBox(NULL,"アクセスできます。","アクセスOK",MB_OK); } file.Close(); *****************************
お礼
ご回答ありがとうございます。 (返事が大変遅れてしまい、すみません。) CFileのデストラクタでファイルを閉じれることを知りませんでした。 本腰を入れて、MFCの勉強をしないといけないな、と感じています。 ご教授、ありがとうございました。