- PR -

ファイルロックの検出

1
投稿者投稿内容
シルクジャスティス
会議室デビュー日: 2003/11/25
投稿数: 6
投稿日時: 2004-09-27 17:12
VB.NETでFile.Moveメソッドを利用してファイルの移動処理をさせるとき
ファイルがロックされているか判断する方法はありますか?

ロック状態でFile.Moveを実行すると移動元のファイルがロックされていても
移動先に同じ名前ファイルがあってもIOExceptionしかキャッチできません。
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-09-27 17:42
引用:

シルクジャスティスさんの書き込み (2004-09-27 17:12) より:
VB.NETでFile.Moveメソッドを利用してファイルの移動処理をさせるとき
ファイルがロックされているか判断する方法はありますか?

ロック状態でFile.Moveを実行すると移動元のファイルがロックされていても
移動先に同じ名前ファイルがあってもIOExceptionしかキャッチできません。



一回、自分で
「必要だと思われるロックで開いてみる」と
わかるんじゃないでしょうか?
シルクジャスティス
会議室デビュー日: 2003/11/25
投稿数: 6
投稿日時: 2004-09-28 09:16
引用:

CHNさんの書き込み (2004-09-27 17:42) より:
引用:

シルクジャスティスさんの書き込み (2004-09-27 17:12) より:
VB.NETでFile.Moveメソッドを利用してファイルの移動処理をさせるとき
ファイルがロックされているか判断する方法はありますか?

ロック状態でFile.Moveを実行すると移動元のファイルがロックされていても
移動先に同じ名前ファイルがあってもIOExceptionしかキャッチできません。



一回、自分で
「必要だと思われるロックで開いてみる」と
わかるんじゃないでしょうか?




CHNさん、ご回答ありがとうございます。
実際に下記の2点を既にやってみまています。

・テキストファイルをメモ帳で開いた状態でファイル移動を行う。
・ファイル移動先に同名ファイルが存在させてファイル移動を行う。

このとき、いずれもIOException(describeは違いますが)で
Catchされてしまいます。
もちろん、移動先に同名ファイルがあるかどうかは先に調べるのですが
悪いタイミングで同名ファイルが存在した場合にその判断を行いたいと
思っています。
Catchした後にファイル存在チェックを行い判断することも可能かとは
思っているのですが、単純にTry〜Catchで処理する方法はないでしょうか?
シルクジャスティス
会議室デビュー日: 2003/11/25
投稿数: 6
投稿日時: 2004-09-28 09:24
以下に間違いがありました
・テキストファイルをメモ帳で開いた状態でファイル移動を行う。

メモ帳⇒Excel

でした。
シルクジャスティス
会議室デビュー日: 2003/11/25
投稿数: 6
投稿日時: 2004-09-28 09:26
たびたびの記述ミスがありました。

describe⇒message

です。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-09-28 09:34
引用:

シルクジャスティスさんの書き込み (2004-09-27 17:12) より:
VB.NETでFile.Moveメソッドを利用してファイルの移動処理をさせるとき
ファイルがロックされているか判断する方法はありますか?



あんまり意味無いと思いますよ。
あるファイルがある瞬間にロックされていなくても、次の瞬間にはロックされているかもしれないわけで。。。

引用:

ロック状態でFile.Moveを実行すると移動元のファイルがロックされていても
移動先に同じ名前ファイルがあってもIOExceptionしかキャッチできません。



試みた操作が Move で、それに失敗したなら、端的に「移動に失敗しました」というえらメッセージを表示すればいいんじゃないですかね?

さらに親切さを求めるなら、エラー表示のダイアログに「詳細」ボタンをつけて、それを押したら IOException.Message の内容を表示してやるとか。

プログラムの制御上、どうしても細かい切り分けが必要なら、MoveFile() か SHFileOperation() API を呼び出して、その戻り値や Marshal.GetLastWin32Error() の値を調べてみるとか。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-09-28 10:12
開いてみるというのは、ソースコードでやってみるというです。
検査の項目として
・コピー先のファイルの存在
・そのファイルへのアクセス権
・読み取り、書き込み可能か
・・・などなど考え得るあらゆることを
をコピー、または移動の前にコードで検査が必要です。
※また、検査をパスできたとして安心できません。ファイルが基本的に
だれでも使用可能ですから。工夫が必要です。

どの検査で引っかかるかで自然となにがどうなっているかはわかるでしょう。
当然検査の順番は工夫が必要です、というか一番重要です。
がんばってください。

[ メッセージ編集済み 編集者: CHN 編集日時 2004-09-28 10:15 ]
シルクジャスティス
会議室デビュー日: 2003/11/25
投稿数: 6
投稿日時: 2004-09-30 10:35
渋木宏明(ひどり)さん、CHNさん ご回答ありがとうございます。

引用:

渋木宏明(ひどり)さんの書き込み (2004-09-28 09:34) より:
あんまり意味無いと思いますよ。
あるファイルがある瞬間にロックされていなくても、次の瞬間にはロックされているかもしれないわけで。。。

さらに親切さを求めるなら、エラー表示のダイアログに「詳細」ボタンをつけて、それを押したら IOException.Message の内容を表示してやるとか。



おっしゃるとおりです。
今回のポイントは利用者へのエラー表示をどう行うかという点につきます。
ユーザーが抵抗感を感じない、かつエラー詳細がわかる表示をおこなうか、
それとも開発者寄りのエラー表示を行うかが最大の問題でした。

引用:

CHNさんの書き込み (2004-09-28 10:12) より:
どの検査で引っかかるかで自然となにがどうなっているかはわかるでしょう。
当然検査の順番は工夫が必要です、というか一番重要です。



そうですね、チェックの順序は重要ですね。
ただ、既にチェックしたものが再度ひっかかる場合も十分考えられるので
その対処は必要でしょうね。

今回はエラー表示としては簡易表示とし、詳細な内容はログに出力するように
したいと思います。

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

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