ファイルが既に開かれているか確認するには?

解決


TA  2009-03-17 16:24:59  No: 33675  IP: 192.*.*.*

delphiで、テキストファイル(xml形式)を読み込んで
編集等をするアプリケーションを作成したのですが、
編集中に別マシンから同じファイルを開いて編集・保存できてしまうため、
デグレードなどの問題が発生してしまいます。
そこで、排他制御をかけたり後で開いた人は読み取り専用にしたりなどの
制御をかけたいと思っています。
既にそのファイルが開かれている状態を判断するよい方法はないでしょうか。
よろしくお願いいたします。

編集 削除
D  2009-03-18 10:37:11  No: 33676  IP: 192.*.*.*

>既にそのファイルが開かれている状態を判断するよい方法はないでしょうか。

"ファイル"が開いているかというより"ファイルハンドル"が開いているかの判断になると思いますが、共有をなしにして開いてみて失敗したら既にそのファイルは開かれていると判断できるのではないかと思います。

function IsOpened(sFile: WideString);
var
  lh_Handle: THandle;
begin
  lh_Handle := CreateFileW(
    PWideChar(sFile),  //ファイル名
    GENERIC_READ,      //アクセス権
    0,                 //共有
    nil,               //セキュリティ属性
    OPEN_EXISTING,     //ファイルは存在する必要あり
    0,                 //属性
    0                  //テンプレート
  );

  Result := (lh_Handle <> INVALID_HANDLE_VALUE);
  CloseHandle(lh_Handle);
end;

メモ帳などだとファイルを開いたあとファイルハンドルは閉じるようなのでこの方法では判定つきませんが。

編集 削除
TA  2009-03-18 16:20:54  No: 33677  IP: 192.*.*.*

返信ありがとうございます。
教えていただいた情報を試してみましたが、うまく判定できませんでした。
TXMLDocument  の LoadFromFile を使用して読み込んでいるのですが、
メモ帳のケースと同様の動きになっているのでしょうか。

編集 削除
およよ  2009-03-18 17:02:55  No: 33678  IP: 192.*.*.*

>メモ帳のケースと同様の動きになっているのでしょうか。
その通りだね。
FileStreamなどで排他制御で読み込み、編集が終わるまでは
そのStreamを閉じ(Free)てはいけない。

編集 削除
D  2009-03-19 02:27:52  No: 33679  IP: 192.*.*.*

TXMLDocumentがどういうものなのか良く分かりませんがLoadFromFileで読み込んだあとにファイルハンドルを閉じるのであれば、直後に自前でFileStreamを使うなりAPIを使うなりしてロックするようにすれば良いのではないでしょうか。
書き込むときは一旦ロックを解除してからSaveToFileで書き込み、終わったらまたロックして、、という感じで。

編集 削除
TA  2009-03-19 11:05:04  No: 33680  IP: 192.*.*.*

およよさん
Dさん

返信ありがとうございます。
アドバイスありがとうございました。
早速試してみたいと思います。

人から引き継いだソースなので時間かかりそうですが。。。

ありがとうございました。

編集 削除
TA  2009-03-19 15:52:01  No: 33681  IP: 192.*.*.*

FileStream を使用してロックをかけることができました!
少々アプリの仕組みが煩雑なのでここから一工夫が必要になりそうですが、
とりあえず当初の目的が達成でき、前に進めそうです。

お二人とも、ありがとうございました。

編集 削除