MoveDirectoryを正常に稼動させるには?

解決


ashigiku  2006-02-01 08:45:15  No: 129983

VB.NETで開発中です。
My.Computer.FileSystem.MoveDirectory(元のパス, 移動先のパス,True)
でフォルダをファイルごとを移動させようと思っているのですが、
時々エラーが出て移動が完了しません(何事も無く完了する時もある)。

エラー後の状態も
1,フォルダが残り、中には移動しそびれたファイルがいくつか残っている
2,フォルダのみ残り、中には何も残っていない。

と安定せず、正常終了と異常終了の差異を探しても見つかりません。
読み取り専用のファイルがあるのが原因かと思い、
読み取り専用属性をはずすようプログラムしてみましたが、
相変わらずエラーが発生します。
移動元を同プログラム中でファイルを参照してるのが問題かとも思い、
imageプロパティをNothingにしたりもしてみましたが、
これも効果はありませんでした。

エラーメッセージには
System.IO.IOException はハンドルされませんでした。
Message="いくつかのファイルまたはディレクトリ上での操作を完了できませんでした。詳細については、例外の Data プロパティを参照してください。"
とありましたが、Dataプロパティの検証の仕方がわからず難航しています。

エラーの原因をしらみつぶしにしようと思っています。
原因に心当たりのある方、また検証法をご存知の方、
教えてもらえれば幸いです。


ガッ  2006-02-01 10:22:30  No: 129984

無知ですが、何とか書いてみました  (´Д`;)

My.Computer.FileSystem.MoveDirectory()が返す例外で、IOExceptionなのは
MSDNから参照:
http://msdn2.microsoft.com/ja-jp/library/519wkbx1.aspx
---
移動元のディレクトリがルート ディレクトリである (IOException)。

組み合わせたパスが既存のファイルを指している (IOException)。

移動元のパスと移動先のパスが同じである (IOException)。

ファイルが既に存在していて、 overwrite が False に設定されている (IOException)。

onUserCancel が ThrowException に設定されていて、ファイルのサブディレクトリがコピーできない (IOException)。
---
らしいですね。

そもそも例外は「ユニークな動作が失敗した場合」に起こるものなので、
結果の取得方法もユニークだと思います。
「例外のDataプロパティを参照してください」と書かれているように、とりあえずDataプロパティを参照してみては?

例)
'勘で書いてます。
try
    '問題のコード
catch ex as System.IO.IOException
    If ex.Data Is Nothing Then
        MessageBox.Show("Dataに何も設定されていません")
    Else
        For Each de as DictionaryEntry In ex.Data
            MessageBox.Show(de.Key & ":" & de.Value)
        Next
    End If
end try

…感じだけ、感じだけです。


ashigiku  2006-02-01 18:17:35  No: 129985

まずは、レスに関してお礼申し上げます。

MSDNは問題が発生した時に参照しました。
4つのエラー原因について、
1.移動元がルートディレクトリ→パスが正しいことは確認済みです。
2.組み合わせたパスが既存→移動先は新規のものと確認されました。
3.移動元と移動先のパスが同じ→1で確認済みです。
4.onUserCancel が ThrowException
  →ユーザインターフェイスについてはいじってません。
    確認できる限りは移動元にサブディレクトリは存在しません。

なによりも、移動が成功しているファイルも存在しているのが、
1から4を証明してくれてるのではと思います。

他の方法(コピーと削除を別々に処理等)を色々試してみたところ、
エラーはどうもコピー時では無く、削除時に発生しているようです。

Dataプロパティについては前述の通り、値を参照しても、
何が正しく、何が間違っているかわからない状態です。
Dataの値については解説されてるページが無いか探して
もう少し検証してみようと思っています。

エラーの発生にばらつきがあるのがこのエラーの難しいところだと思います。
エラーが起きる要因が特定できれば少しは簡単になるかと思うのですが。
共通点らしきものが見つかりません。


ashigiku  2006-02-02 10:11:23  No: 129986

Dataプロパティについて調べていって
解放したはずのimageプロパティと競合していることが判明しました。
http://dobon.net/vb/dotnet/graphics/drawpicture2.html
によると、fromfileで読み込んだファイルはロックがされてしまい、
disposeによって解放してもアクセスが拒否されるようです。

転送失敗のファイル数の違いはアクセス拒否されるファイルが
MoveDirectoryの内部処理で何番目に選択されるかの違いだったようです。
フォルダのみ残る場合については判明してませんが、
今回のエラーとは異なる原因があるのではないかと思います。

disposeで全て解放できるものと思い込み原因の根本を示せず、
申し訳ないです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加