いつも参考にさせて頂いています。
環境は以下のとおりです。
環境
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さんレスありがとうございます。
リプライ遅くなり申し訳ありません。
秀丸ってそういう動きしているのですね。知りませんでした。
ファイルが既に共有モードで開かれているかのチェックですが、
指定したファイルをCloseボタンを押されるまでfopen や_open
で開きっぱなしにする簡単なプログラムを作って試したところ
前述のコードでちゃんと判断してくれました(Win2000/Meにて
確認済み)。
先に秀丸やメモ帳でファイルを開いた場合でも、プログラムで
排他モードにしてやれば、その間は上書き保存も削除もできない
のでOKかな・・・と思っています。
どうもありがとうございました。
また宜しくお願いします。