ファイルが既にオープンされているか調べる方法

[戻る]
ふぁいと! 2002/09/04(水) 15:15:30
いつも参考にさせて頂いています。
環境は以下のとおりです。
環境
Win2000(SP3)
VC++6.0(SPなし)
MFC

同一ファイルを複数プロセスで参照・更新したいのでファイルの
排他制御を行おうとしているのですが、該当のファイルが共有モード
で既にオープン(別プログラムや秀丸・メモ帳など)されているか
どうかをチェックする方法がわかりません。
ヘルプで以下のような記述があり試してみましたが(秀丸で該当ファイル
を先に起動し、次に該当ファイルを指定し排他モードにするプログラムを
実行)期待値を返してくれませんでした。
どなたかよい方法を知っている方がいましたらご教授下さい。
宜しくお願いします。

★開発環境はWin2000ですが、使用機種はWin9x系(98以降)、
 WinNT系を考えています。


/***************************************************************************/
* ファイルが既にオープンされているかのチェック
* 戻り値
* TRUE: ファイルが既にオープンされている
* FALSE:    ファイルがオープンされていない
*    NTFSセキュリティのため呼び出し側アプリケーションにファイルに対する
*        アクセス権がない
*    ファイルが存在していない
/***************************************************************************/
BOOL CVcTestDlg::IsFileAlreadyOpen(char *filename)
{
    HFILE theFile = HFILE_ERROR;
    DWORD lastErr = NO_ERROR;


    // ファイルを排他オープン 
    theFile = _lopen(filename, OF_READ | OF_SHARE_EXCLUSIVE);

    if (theFile == HFILE_ERROR)
        // 今のエラーを保存
        lastErr = GetLastError();
    else
        // 無事オープンした場合はファイルをクローズ
        _lclose(theFile);

    // 共有違反がある場合はTRUEを返す
    return ((theFile == HFILE_ERROR) &&
        (lastErr == ERROR_SHARING_VIOLATION));

}

wood 2002/09/04(水) 17:32:36
秀丸は、難しいのではないですかね
一度自分のワークに読み込んだら元ファイルをクローズしているみたいですけど
開発者にメールしてみてはどうですか

ふぁいと! 2002/09/04(水) 21:20:11
[[解決]]
woodさんレスありがとうございます。
リプライ遅くなり申し訳ありません。
秀丸ってそういう動きしているのですね。知りませんでした。

ファイルが既に共有モードで開かれているかのチェックですが、
指定したファイルをCloseボタンを押されるまでfopen や_open
で開きっぱなしにする簡単なプログラムを作って試したところ
前述のコードでちゃんと判断してくれました(Win2000/Meにて
確認済み)。
先に秀丸やメモ帳でファイルを開いた場合でも、プログラムで
排他モードにしてやれば、その間は上書き保存も削除もできない
のでOKかな・・・と思っています。

どうもありがとうございました。
また宜しくお願いします。

古いスレッドには追加発言できません。