• ベストアンサー

【VC++6.0(MFC)】ファイルがアクセス中か確認したい

いつも大変お世話になっています。 VC++初心者です。 あるファイル(ファイル名はCString型)が 他からアクセスされているか(今回の場合、書き込み中か) 確認したい場合はどのようにしたら宜しいでしょうか。 お手数ですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.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で調査するほうが適切に思われます。

yuki7091
質問者

お礼

ご回答ありがとうございます。 (返事が大変遅れてしまい、すみません。) CFileのデストラクタでファイルを閉じれることを知りませんでした。 本腰を入れて、MFCの勉強をしないといけないな、と感じています。 ご教授、ありがとうございました。

その他の回答 (1)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

単純にOpen()すれば良いのでは? MFCだからCFile::Open()でCFile::shareDenyWrite()を指定すれば 書き込み中の場合はOpen()失敗となって検出できます。

yuki7091
質問者

お礼

ご回答ありがとうございます。 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(); *****************************

関連するQ&A

  • 【VC++2005(CLR)】ファイル書き込み時、他でファイルが開かれていると落ちる

    いつも大変お世話になっています。 VC初心者です。 現在、ファイル書き込み処理で悩んでいます。 他のユーザがファイルをオープンしてたり、開こうとすると 落ちてしまいます。 たとえば、ファイルが開かれていることを検知して、 ユーザに「ファイルを閉じてください」とメッセージを出した後、 再度書き込み処理を実行できませんでしょうか。 (書き込み中は他のユーザからのアクセスを拒否させたいです。) 現在以下のようなソースを書いています。 //ファイルオープン System::IO::StreamWriter^ sw = gcnewSystem::IO::StreamWriter( path_w,false,System::Text::Encoding::Default); //ファイル書き込み String^ newData = "aaa"; sw->WriteLine(newData); //ファイルクローズ sw->Close(); お手数ですが、よろしくお願いします。

  • 【VC++6.0(MFC)】CString型の変数から数字部分を取り出すには?

    いつも大変お世話になっています。 VC初心者です。 現在、VC++6.0(MFC)でコーディングしております。 早速ですが、有識者の方がいらっしゃいましたら ご教授頂きたくお願いします。 ===質問=== CString型変数に以下のような数値を含む文字列から 数値部分だけを取り出すにはどうやってソースを 組めば宜しいでしょうか? ===例01=== CString cs1 = "2009年7月29日"; この文字列から "2009","7","29"を取得したい ===例02=== CString cs2 = "AM10:00:00 -0.4℃"; この文字列から "10","0","0","-0.4"を取得したい 以上、よろしくお願いします。

  • VC++からmdbファイルへのアクセス

    言語知識はほとんど初心者で、C++を少しだけやっていました。 調べてもわからなかったので質問させていただきます。 Access2003で作成したmdbファイルを Visuial Studio2005のVC++を使ってmdbファイルを参照、追加、更新をしたいのですが 全く手がつけられない状態です。 どのように書けばいいのか指南してくれると幸いです。 また、Access2000とAccess2003ではやり方が違うのでしょうか?

  • 【WindowsXP、VC++2005、MFC】

    【WindowsXP、VC++2005、MFC】 CFile::Openで、他プロセスがOpenしたいファイルにアクセス中で、Openに失敗した際、ファイルにアクセスしているプロセスを特定する事は可能でしょうか? ご存知の方がおられましたらご教授お願いいたします。

  • 【VC++2005 MFC】構造体のコピーについて

    【VC++2005 MFC】構造体のコピーについて 構造体をコピーする時、単純に「=」で代入しているのですが、先輩に 「それじゃコピー出来ないから各メンバごとに代入するような関数作れ」 と言われました。 私自身、C言語の初心者ですが、ネットで調べてみると、単純に「=」で代入出来る ような気がしております。 ただ拝見したサイトに記載されている構造体は型が「int」「char」なのですが、 「CString」を使っていたり、構造体の中に更に構造体が入っていたりする場合も 単純に「=」で代入出来るのでしょうか? (というか、実際にコーディング、デバッグして、コピー出来ている事は確認しているん ですが、先輩いわく、「CStringとかのクラスが含まれている場合はダメだと思う。 メモリが壊れると思う」との事でした。)

  • 【VC++6.0(MFC)】「Out of memory」の対処の仕方を教えてください。

    いつも大変お世話になっております。 VC++初心者です。 現在、VC++6.0(MFC)のソース修正を行っております。 そのソースを長時間実行させると、メッセージボックスで タイトル:ソフト名 メッセージ:Out of memory と出てきて悩んでいます。 (コンパイル、ビルドは成功しています。) (そのソフトを立ち上げなおすと、しばらくの間は正常に動作します。) 大変お手数ですが、 この問題を対処する手順や怪しいと思われる箇所を 経験則でも宜しいので教えて頂けませんでしょうか。

  • VC++での外部ファイル(batファイル)の実行

    VC++のコード上で.batファイルを実行する必要が出てきたのですが、 VC++で外部ファイルを実行、その結果を受け取るにはどうすればよいのでしょうか? ちなみに使用しようと思っているバッチファイルは、juliusという音声認識エンジンです。 1.go.batからjulius.exeが起動 2.「### read waveform input enter filename->」と言う記述が出てくるので、wavファイルのファイル名を指定してエンター 3.#sentence1: ついに 、 他 団体 戦 。 #wseq1: <s> ついに:ツイニ:ついに:503 、:、:、:10 他:タ:他:188 団体:ダンタイ:団体: #507 戦:セン:戦:520 。:。:。:8 </s> #phseq1: silB | ts u i n i | sp | t a | d a N t a i | s e N | sp | silE のようにcmd.exe上に結果が返ってくる。 この一連の動作を、1のファイル名をVC++上で指定し、 3のcmd.exe上で現れる分をVC++上で受け取る(CStringなりに格納する)ような方法は無いでしょうか。 もし他に良い方法をご存知の方がいましたら、教えていただければ幸いです。

  • 【VC++6.0(MFC)】スタックメモリサイズの変更方法

    いつも大変お世話になっております。 VC++初心者です。 スタックメモリサイズがデフォルトで1Mが設定されているようですが、 それを確認、及び、変更する方法を教えていただけませんでしょうか。 (具体的には、1.0Mから0.5Mにしたいです。) ちなみに、某サイトで 「プロジェクトのプロパティ→リンカ→システム→スタックのサイズの設定」 で変更可能であるとあったのですが、「プロジェクトのプロパティ」が何を指すのか分かりませんでした。 お手数ですが、よろしくお願いします。

  • 【VC++6.0(MFC)】スレッドの呼び出し方について

    いつも大変お世話になっております。 VC++初心者です。 現在、下記のサイトでマルチスレッドを勉強していますが、 そのスレッドの呼び出し方が分かりません。 具体的にどのように書けば宜しいのでしょうか。 http://www.takebay.net/~daigo-ao/paddlewiki.pl/title_4350505FA5B9A5ECA5C3A5C9A4CEBBC8A4A4CAFD5F4D4643C8C7.html mainではないですが、別のクラスから呼び出そうと思い、 以下のように書きましたが、駄目でした。 CHoge aaa; aaa.RunThread(); お手数ですが、よろしくお願い致します。

  • 【VC++2005(CLR)】ファイルが他で使用されていると、落ちてしまう

    VC++初心者です。 現在、VC++2005 express edition、CLRプロジェクトでコーディングしております。 質問のタイトルをもう少し具体的に説明しますと、 あるファイルを開きっぱなしにして、 そのファイルを読みにいこうとするとプログラムが落ちてしまいます。 これを回避するにはどうしたら宜しいでしょうか? もし、読みたいファイルが使用中でも、使用終了されたら、 すぐにそのファイルを読みに行くことは可能でしょうか? お手数ですが、よろしくお願いします。