• ベストアンサー

CloseHandle以外でファイルを閉じる方法

CreateFileでファイルをオープンした後、うっかりCloseHandleせずにプログラムを終了してしまったとします。 するとそのファイルは、Windowsを再起動するまで、削除できなくなりますよね。 これを、再起動せずにクローズする方法ってないもんでしょうか? もう一度プログラムを実行しても、ハンドルオープンしたままですから、当然CreateFileも失敗しますし……。 よくファイル操作するプログラムを作るのですが、しょっちゅうCloseHandleし忘れて再起動するハメになるので、再起動なしでクローズできる方法があれば非常にありがたいのです。 やっぱり、素直に再起動するしかないんでしょうか。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

こういうことでは?

参考URL:
http://www.okweb.ne.jp/kotaeru.php3?q=282478
ryo_f
質問者

お礼

回答ありがとうございます。 参考URLを見ました。 VBそのものを終了させればよかったんですか! 今までずっとプログラムだけ終了させてデバッグしていたため、再起動しか方法がないと思い込んでいました。 ひとつ利口になりました。ありがとうございますた。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#4252
noname#4252
回答No.2

CloseHandle しなくてもそのプログラムが終了したらクローズされるはずですが。 どのバージョンのWindowsでどのようにCreateFileを使用しているのでしょうか? また何か排他処理をしているのでしょうか?

ryo_f
質問者

お礼

回答ありがとうございます。 環境はWindows2000でVB6です。 ファイルオープンは普通に、 lHandle = CreateFile(FileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) といった感じでオープンしています。特に排他処理はしていません。

全文を見る
すると、全ての回答が全文表示されます。
  • ShaneOMac
  • ベストアンサー率39% (356/898)
回答No.1

ハンドルクローズ処理はメモリリーク問題と並んでリソース管理の基本ですから、それを怠ること自体がプログラムとして大きな問題になります。ハンドルをクローズしないとファイルディスクリプタが消費され、システムリソースを圧迫しますから、そういうプログラムを組んではいけません。 IPAのセキュアプログラミング講座のリンクを挙げておきます。きっと参考になるでしょう。 解決策を簡単に言えば、クラスのデストラクタを利用し、確実にリソースを解放するということです。もちろんそれならば、MFCを初めから使えば自前でそこらへんを考慮する必要もなくなりますが。

参考URL:
http://www.ipa.go.jp/security/awareness/vendor/programming/b06_06.html
ryo_f
質問者

お礼

回答ありがとうございます。 もちろん、きちんとクローズ処理をするのが基本だというのはよくわかっているのですが、デバッグ中についつい途中で終了させてしまったりして、しまった……ということがよくあるのです。 もしも再起動しなくてもファイルをクローズできる方法があるなら楽だなぁ、という都合のよい考えでした質問でした。 あ、それと、質問には書き忘れましたが、言語はVBです。C++はたまに使いますが、あまり知識がありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Visual Basic 6.0でWin32APIを用いてRS-232

    Visual Basic 6.0でWin32APIを用いてRS-232Cで通信するプログラムを作っています。 CreateFile()でポートを開き、ハンドル番号を得て、プログラム終了前にそのハンドルを指定してCloseHandle()シリアルポートをクローズします。 ところが、何らかの原因でそのハンドルのクローズを行わなかった場合(例えば、デバッグ中にプログラムを終了させる)、シリアルポートは開っぱなしのようで、再度プログラムを実行しようとするとCreateFile()でポートを開くことが出来ません。 この状態は、VB6を再起動しない限り続きます。 そこでお聞きしたいのですが、プログラム上で、現在シリアルポートを開いているハンドル番号を知る方法はあるのでしょうか? 開いたときにメモするのも煩わしいため、なんとかならないかと悩んでいます。 どうぞよろしくお願いします。

  • CreateFile関数でCOMポートが開けない

    以下の手順でCOMポートをオープンすると、(4)のCOMオープンが必ず失敗します。 GetLastError関数でエラーコードを取得するとERROR_FILE_NOT_FOUNDが返ってきました。 心優しい方、(4)のCOMオープンを成功させる方法を教えていただけないでしょうか? (1)CreateFile関数でCOMポートをオープンし、オープン中にUSBを抜き差しする。 (2)PurgeComm関数で送受信バッファをクリア (3)CloseHandle関数でCOMポートのハンドルをクローズ (4)CreateFile関数でCOMポートを再度オープン←NG 以上、どうぞよろしくお願いいたします。

  • CreateFileの後始末

    hFile=CreateFileの戻り値が hFile==INVALID_HANDLE_VALUEのときに CloseHandle(hFile)を実行しなくていいのでしょうか?

  • WinAPIでのファイル操作について教えて下さい。

    現在参考書やwebサイトと参考にWindowsプログラミングを学んでいます。 下記のサイトにあるファイル作成のソースをコンパイルして実行したのですが http://wisdom.sakura.ne.jp/system/winapi/win32/win111.html #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { HANDLE hFile; hFile = CreateFile( lpCmdLine , GENERIC_READ , 0 , NULL , CREATE_NEW , FILE_ATTRIBUTE_NORMAL , NULL ); if (hFile == INVALID_HANDLE_VALUE) { MessageBox( NULL , TEXT("ファイルを作成できません") , TEXT("エラー") , MB_OK ); return 1; } CloseHandle(hFile); return 0; } コンパイルは成功するのですが実行すると必ずエラーになります。 他のソースも同様にファイル操作に失敗した場合の表示が行われます。 自分が持っている参考書にはファイル操作についてあまり詳しく書かれていないので他のソースも試せません。 どなたか教えて下さいよろしくお願いします。

  • vbsで同一ファイルに出力するには

    お世話になります。 vbsでログ出力プログラムを作成しています。 このプログラムは同時に複数のプログラムから呼び出されます。 同時書込みの試験をしていた所、2番目に実行したログ出力プログラムでログ出力に 失敗してしまいました。 ###試験方法### ファイルのオープンとクローズの間にmsgboxを実行し、オープン中を維持した状態で、 ログ出力プログラムを実行し、追記処理を行いました。 ###質問内容### 同時書込みは可能でしょうか。 可能な場合、その方法をご教授頂けますでしょうか。 よろしくお願いいたします。

  • フロッピー上のファイルクローズ時のメッセージ表示について

    フロッピーへアクセスするDLLを作っています。 環境は、Window NT4.0 SP5 & C です。 フロッピー上のファイルへのアクセスが終わり CloseHandleを実行する前に、(微妙なタイミングだとは思いますが)媒体がFDDから抜かれてしまった場合、CloseHandle実行時に次のメッセージが表示されることがあります。 |-------------------------------------------------------------------- |システムプロセス - ディスクがありません。               | | ドライブにディスクがありません。ディスクをドライブ A:に挿入して下さい。| |   中止(A) 再試行(R) 無視(I)                    | |--------------------------------------------------------------------|    ( ↑    ↑    ↑   註:ボタンです。) このメッセージを表示せずにCloseHandleを行う方法をご存知でしたらご教示下さい。(メッセージを表示することなく、強引にハンドルをクローズしたり、あるいは、CloseHandleを即 異常終了させるような方法はあるのでしょうか?) よろしくお願いします。

  • VBでオープンしたファイルの制御をCのプログラムに渡す方法

    VBでファイルのオープンをしてそのファイルの制御を Cのプログラムに渡す方法ってありますか? やりたいことを具体的にいうと ファイルのオープン、クローズはVBでやって、 ループの中の変数の値を、Cのプログラムに渡して Cのプログラムの中で印字するって処理をやりたいのです。 Cのプログラムをコールする際の引数で VBで開いたファイルハンドル、出力したい変数の値を 渡してやれば良いのかなと思ったのですが、うまくいかないようです。 なにか方法があれば教えてください。 宜しくお願い致します。 Dim i as Integer Open "\test.txt" For Output As #1 for i=0 to 10 call Cのプログラム(#1、i) next i close #1

  • Perl ファイルハンドルを閉じずに反映させる

    お世話になっております。 Perl(プログラミング言語)について質問です。 openメソッドで開いたファイルハンドルに print文で書込みを行った際に、ファイルハンドルをcloseせずに、 書込みを反映させる方法はありますか? 開くのはファイルではなく(他プロセスへの)パイプです。 $| を設定してもだめでした (例としては perl1.pl , perl2.pl を用意する <perl1.pl> $i; open(OUT,"| perl2.pl") while(1){ print OUT "$i" $i++  } close(OUT) <perl2.pl> while( <STDIN> ) { print $_; } のようなことをやりたいです。 上記のようなスクリプトを実行したところ、 perl1のcloseが実行されるまで反映されません。 これをcloseをせずに反映させる方法はありますでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • C#でのプログラム方法

    C#(コンソールでの実行ファイル)でのバッチファイル実行方法に悩んでいます。 実行イメージとして **************************************** 1. C#(A.exe)をダブルクリックで起動する 2. C#プログラム[A]はバッチファイルを起動する 3. C#(B.exe)をダブルクリックで起動する 4. C#プログラム[B]は2で起動したバッチファイルを終了させる(=DOS窓をCloseさせる?) **************************************** を考えています。 1~2の処理はなんとなくわかったのですが 4にてバッチファイルが起動しているDOS窓をどうCloseさせたらいいのかわかりません。 助けてください。

  • C言語 iMacでのファイル入出力

    #include <stdio.h> int main() { FILE *fp; fp=fopen("test.txt","w"); if (fp==NULL){ perror("ファイル・オープンに失敗しました\n"); return -1; }else printf("ファイルを正常に開きました\n"); fprintf(fp,"これが初めてのファイル入出力です\n"); if (fclose(fp)!=0){ perror("ファイル・クローズに失敗しました\n"); return -1; }else printf("ファイルを正常に閉じました\n"); return 0; } これを実行してもどこにもtest.txtというファイルがありません。 同じプログラムをwinでも実行してみたところ正常にファイルが作られました。 mac初心者なもんで、どうすればいいのでしょうか?