- PR -

エクスプローラーでコピーしたら 書込みアプリケーションがロック

1
投稿者投稿内容
わからん!
会議室デビュー日: 2006/10/28
投稿数: 1
投稿日時: 2006-10-28 15:41
初心者です。
なんだか訳が分からず、困っています。

Windows2000 Serverの環境で、
バイナリファイルを読み書きするアプリケーションを実行させています。

アプリケーション実行中に、
バイナリファイルをエクスプローラーでMOにコピーしたところ
アプリケーションが固まってしまいました。
※実際には、実行していれば出力するメッセージが出ていないので
 固まったと判断したのですが・・・。

アプリケーションは、VCで組んでおり、
バイナリファイルは、共有モードでOPENしています。
fp = _sopen ( filname , O_RDWR|_O_BINARY , _SH_DENYNO )

その上で、ファイルサイズを取得してロックをかけています。
fsize = _filelength( fp );
sts = _locking( fp, _LK_LOCK , fsize));

上記のようなロックを書けた場合に、
エクスプローラーでコピーをすると、ロックしてしまうのでしょうか?

エクスプローラーのコピーがどのような原理で動いているのか分からず、
困っております。

返信をお待ちしております。
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2006-10-29 10:57
確かに原理はわかりません。
実際にソースを参照できる方からの返答は期待できませんし。
ですが、エクスプローラーがロックを取得しているかどうかは、
ファイルをロックし続けるようなアプリを作成し、ロック中にファイルをコピーできるかどうか
などでも判断できますよね。

2000Serverは所有していないので試せませんが、XPpro、2000proで試した結果、エクスプローラはロックを取得しようとします。
(ファイルサイズが257kbyte未満の場合はロックしない。ただ、こちらは2000proで確認していない。)
ただ、わからん!さんの問題はエクスプローラのコピーによるロックとは直接関係しないと思われます。
エクスプローラはロックに失敗した場合はユーザにダイアログで知らせます。また、取得したロックはきちんとアンロックしています。

提示された情報で気になる部分はファイルサイズの取得部です。
_filelengthはlong値を返するため、大きなファイルだとサイズが返りません。
そのあたりのエラー処理が抜けていれば、ロックを取得しないまま処理してしまうなどして問題が発生した可能性はあります。
1

スキルアップ/キャリアアップ(JOB@IT)