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

OpenFileDialogの初期表示ディレクトリに関して

環境/言語:[開発環境:Win7 .net2005 動作環境:WinXP、7 .NET Frameworkバージョン2.0以上]
分類:[.NET]

いつも困ったときに助けていただいています。

OpenFileDialogの初期表示ディレクトリに関して、
WinXPとWin7で挙動が異なり苦戦しています。
解決策をご存知の方がいらしたらご教示ください。

OpenFileDialogの初期表示ディレクトリを外部ファイルに定義し、
その設定値を読み込んでInitialDirectoryに設定するという、
単純なプログラミングなのですが、
外部ファイルの定義に、存在しないディレクトリを指定した際の
挙動がXPと7で動作が異なるのです。
.NET Frameworkのバージョン違いも疑ったのですが、
OSの違うほうが原因と思えます。

-----------------------------------------------------------------
Dim txtPath As String = "C:\abc.txt" ' チェックポイント(1)
Dim txtFile As IO.StreamReader
Dim dir As String

' テキストファイルが存在しない処理は割愛
txtFile = New IO.StreamReader(txtPath, System.Text.Encoding.Default)
dir = txtFile.ReadLine

' デバッグのために読み込んだディレクトリを表示
MsgBox(dir) ' チェックポイント(2)

OpenFileDialog1.InitialDirectory = dir ' チェックポイント(3)

If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
lbl_path.Text = OpenFileDialog1.FileName ' チェックポイント(4)
Else
Exit Sub
End If
-----------------------------------------------------------------
■1回目の処理
チェックポイント(1)
abc.txtに存在しないディレクトリを定義しておく。(仮にC:\test_errorとする)
チェックポイント(2)
メッセージボックスに「C:\test_error」が表示されることが確認できる。
チェックポイント(3)
指定したディレクトリが存在しないので、直前で開いたダイアログの
ディレクトリが表示される。(これは期待した通りの結果)
チェックポイント(4)
自分の希望するディレクトリに移動して、ファイルを選択、
ラベルに指定したファイルのパス+ファイル名を表示。

と、ここまで処理をした後、
abc.txtを正しいディレクトリ指定に書き換えて、
再度上記処理を実行した際の挙動がXPと7で異なります。

■2回目の処理
チェックポイント(1)
abc.txtに存在するディレクトリを定義しておく。(仮にC:\test_okとする)
チェックポイント(2)
メッセージボックスに「C:\test_ok」が表示されることが確認できる。
※ここはXP,7共に同じ挙動
チェックポイント(3)
ここがXPと7で挙動が異なります。
XP:1回目の処理のチェックポイント(4)で指定したディレクトリが
表示される。(期待していない結果)
7:「C:\test_ok」ディレクトリが表示される。(期待する結果)

つまり、XP環境で「InitialDirectory」設定が有効にならないのです。
理由が分からず、心が折れそうです。
どうかご存知の方いらしたら助けてください・・・。
■No29033に返信(ちぃさんの記事)
> Dim dir As String
VB には「Dir 関数」という物があります。間違いではありませんが
混乱の元なので別の変数名にしておいた方が良いでしょう。

> txtFile = New IO.StreamReader(txtPath, System.Text.Encoding.Default)
ファイルを閉じ忘れていますよ。

> 理由が分からず、心が折れそうです。
前回の「FileName」をリセットしていないからでしょうね。

OS の違いといえばそれまでですが、どうしても前回のファイル名を
残しておきたいのであれば、ShowDialog の前に
 If OpenFileDialog1.FileName <> "" Then
  OpenFileDialog1.FileName = System.IO.Path.GetFileName(OpenFileDialog1.FileName)
 End If
とでもしておいてみては如何でしょう。
■No29033に返信(ちぃさんの記事)

デフォルトディレクトリは設定するけれど、ファイル名は設定する必要がないのであれば、
他の方法として、常に新しいOpenFileDialogのインスタンスを使うというのも手だと思います。
VB2005だということなので、Usingを使って

Using d as New OpenFileDialog
    d.InitialDirectory = defaultDir
    If d.ShowDialog() = Windows.Forms.DialogResult.OK Then
        lbl_path.Text = d.FileName ' チェックポイント(4)
    Else
        Return
    End If
End Using

という方法は、私はよく使います。
これは、 魔界の仮面弁士さんもご指摘のように、一度使ったOpenFileDialogのプロパティ(例えばFileName)に
前に使用した情報が残ってしまい、場合によってはそれが邪魔になるからです。
魔界の仮面弁士様
タラオ様

おはようございます。早々の書き込みありがとうございます。

> Dim dir As String
> VB には「Dir 関数」という物があります。間違いではありませんが
> 混乱の元なので別の変数名にしておいた方が良いでしょう。

おっしゃるとおりです。早速改めます。

> txtFile = New IO.StreamReader(txtPath, System.Text.Encoding.Default)
> ファイルを閉じ忘れていますよ。

ご指摘ありがとうございます。ついつい忘れてしまいます。悪い癖です。

> 理由が分からず、心が折れそうです。
> 前回の「FileName」をリセットしていないからでしょうね。

なるほど!!ファイルClose処理とも併せて、
開いたものは閉じる、使用したものはリセット、大事な処理ですね。
肝に銘じて以降、プログラミングいたします。

前回のファイル名を残す必要は無いので、
タラオ様推薦の処理を利用してリトライしたいと思います。

3年ほどプログラマーの職から離れておりまして、
久しぶりに復帰したら、ボケボケになってしまいました。
VB6.0以降、VBからも離れていたので、
VB6.0から.Netへの変わりっぷりに毎日悪戦苦闘状態です。
ここのサイトがとても有益な情報を教えてくださるので、
とても助かっています。

今後もどうぞよろしくお願いいたします。
魔界の仮面弁士様
タラオ様

早速ご教示いただきました内容を反映させました。

結果、無事問題は解決し、外部ファイルの定義変更の都度、
OpenFileDialogの初期表示ディレクトリもその変更が反映されて
動作するようになりました。

本当にどうもありがとうございました。
助かりました!!
解決済み!

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