DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ダイアログのRestoreDirectoryについて

環境/言語:[WindowsXPSP1 VB.NET .NETFramework1.1SP1]
分類:[.NET]

いつも参考にさせていただいています。
OpenFileDialogを使ってファイルを指定させ、
そのファイルがあるディレクトリごと削除する機能を作っているのですが、
OpenFileDialog.RestoreDirectoryをFalseに設定するとディレクトリ削除時に
アクセスエラーが起こってしまい削除することができません。
ライブラリには
「ダイアログ ボックスを閉じる前に、現在のディレクトリを復元するかどうかを示す値を取得または設定します。」
とありますがサンプルコードを見てもどのような動作なのか分かりません。
RestoreDirectoryの動作が分かる方、削除できない理由がお分かりになる方がいらっしゃいましたらご教授お願いします。

以下検証コード---
        'テストファイル作成
        Directory.CreateDirectory("C:\testdir")
        Dim fs As New FileStream("C:\testdir\test.txt", FileMode.CreateNew)
        fs.Close()

        'ダイアログの設定
        Dim ofd As New OpenFileDialog
        ofd.Filter = "テキストファイル (*.txt)|*.txt"
        ofd.FilterIndex = 1
        ofd.InitialDirectory = "C:\testdir"
        ofd.FileName = "test.txt"

        'ここでFalseとすると削除時にエラーが発生する
        ofd.RestoreDirectory = False

        'ファイルの指定
        Dim fn As String
        If ofd.ShowDialog = DialogResult.OK Then
            fn = ofd.FileName
        End If

        'ダイアログの破棄
        ofd.Dispose()
        ofd = Nothing

        '指定したファイルのあるディレクトリの削除
        If File.Exists(fn) Then
            Dim fi As New FileInfo(fn)

            'ここでエラー発生
            fi.Directory.Delete(True)
        End If
■No18767に返信(AREXさんの記事)

OpenFileDialog でディレクトリを選択したときに、カレントディレクトリが変更に
なっているからだと思います。
カレントディレクトリは削除できないので、エラーが発生します。

というか、エラーが発生したときにそんな感じのメッセージは出ていませんでしたか?
(カレントディレクトリが…とかはないと思いますが、削除できない理由)
「エラーが起こってしまいます」だけでは答える側もちょっとわからないので(今回も
推測でしかないですし)エラーメッセージをそのまま書いていただけると回答しやすいです。
■No18768に返信(ぽぴ王子さんの記事)

詳細を書き込まずにすいませんでした。
以下のエラーメッセージがでました。
'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : プロセスはファイル "C:\testdir" にアクセスできません。このファイルは別のプロセスが使用中です。
■No18769に返信(AREXさんの記事)
> ■No18768に返信(ぽぴ王子さんの記事)
>
> 詳細を書き込まずにすいませんでした。
> 以下のエラーメッセージがでました。
> 'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。
>
> 追加情報 : プロセスはファイル "C:\testdir" にアクセスできません。このファイルは別のプロセスが使用中です。

詳細情報ありがとうございます。
で。
「プロセスはファイル "C:\testdir" にアクセスできません。」
というのが何を示しているかというと、C:\testdir 以下のファイルを別のプログラムが
開いているか、あるいはカレントディレクトリが C:\testdir になっている場合に起きます。
(エクスプローラが『開いている』ことになるのかな)

前にも書いたように、OpenFileDialog ではディレクトリを選択というか遷移したときに、
カレントディレクトリが変更されます。
RestoreDirectory プロパティは、その変更されたカレントディレクトリを元に戻すかどうか
のプロパティなので、これを False に設定しておくと、最終的にファイル選択時のカレント
ディレクトリは選択したファイルの存在するディレクトリになります。
なので、カレントディレクトリを削除しようとしてエラーになっているのだと思われます。

…っていうのを No18768 で書いてみてたのですけど、試されましたか?
削除前にカレントディレクトリを別のディレクトリに設定してからやってみると、違いがわかる
と思います。
ちょっと話がズレますが、.NET Framework 2.0以前なら「Try〜Catch〜Finally」、以降なら「Using」または「Try〜Catch〜Finally」をエラーが発生しそうな所に入れる癖をつけておいたほうがいいですよ。
特に、ファイルIO関係はいろいろな要素でエラーが起こりやすいので…
ぽぴ王子さん
GetCurrentDirectoryで確認したところ確かにカレントディレクトリを削除する動きに
なっていました。
RestoreDirectoryをTrue設定にするとダイアログで指定してもカレントディレクトリが
変わらないのでエラーが起きませんでした。

ぺがらぼさん
ご忠告ありがとうございます。一応本プログラムでは全体の例外を一箇所に集めて
エラー表示しています。
今後勉強してファイル操作時の例外をそれぞれのエラー処理で解決するようにしたいと思います。

皆様ご教授ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板