こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイルダイアログのカレントフォルダ

vb.netのOpenFileDialogでダイアログを開いたとき、最初はマイドキュメントが表示されますが
違うフォルダからファイルを選ぶと、次にダイアログを開いたときはそのフォルダ(カレントフォルダ?)がまず表示されます。
その情報はどこに保存されてるのですか?

同じパソコンでプログラムをコピーして交互に動かしてもカレントフォルダはその度に変わってるようです。
別のパソコンにプログラムをコピーしたら(最初だけは)マイドキュメントからになるんですか?



もう1つ質問で
RestoreDirectoryプロパティにtrueを設定してもカレントフォルダは変わるようなのですが
なぜでしょう?
試しに作ったコードは↓です。

環境はvb2005、XP-sp3です。

--------------------
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

' OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない)
Dim OpenFileDialog1 As New OpenFileDialog()

' ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 False)
OpenFileDialog1.RestoreDirectory = False

' ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
MessageBox.Show(OpenFileDialog1.FileName)
End If

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

' OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない)
Dim OpenFileDialog2 As New OpenFileDialog()

' ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 False)
OpenFileDialog2.RestoreDirectory = True

' ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する
If OpenFileDialog2.ShowDialog() = DialogResult.OK Then
MessageBox.Show(OpenFileDialog2.FileName)
End If

End Sub

End Class
--------------------

投稿日時 - 2011-05-15 10:11:23

QNo.6738744

暇なときに回答ください

質問者が選んだベストアンサー

Google先生によると、Q5748915で一回会ってるみたいね。

さて、本題。
当方Windows XP上で検証。

i)
MS謹製の.NET Frameworkでは、
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU
とかに書きこまれている模様。

#確認できる環境はなく確実ではないが、以下のサイトのものとキーが違うんだよなー。Vistaだからかなあ?
http://www.winhelponline.com/articles/195/1/How-to-clear-the-file-names-MRU-in-Common-Dialog-boxes-in-Windows-Vista.html

もし、ここであっているなら、そのアプリケーションを別マシンに持っていったらそのマシンのユーザー用のレジストリを参照するから、当然それぞれ別のディレクトリが参照される。

ii)

>RestoreDirectoryプロパティにtrueを設定してもカレントフォルダは変わるようなのですがなぜでしょう?

たしかに名前はそんな機能に見える。魔法の言葉「RTFM」を唱えてみよう。
==================
http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.aspx

>Important
重要

>If the user of your application changes the folder in the FileDialog, then the current working directory for your application is set to the location specified in the FileDialog. To prevent this, set the RestoreDirectory property to true.

あなたのアプリケーションのユーザが、(OpenFileDialog等の継承元の)FileDialogのフォルダを変更した場合、あなたのアプリケーションのカレントワーキングディレクトリが、FileDialogで指定した場所に変更される。これを防ぐためにはRestoreDirectoryをtrueに設定してください。
==============================================
…何でそんな設計なんだよ(怒) > MS
で、このカレントワーキングディレクトリはOpenFileDialogが次回開く場所とは関係がない。それはおそらく、InitialDirectoryプロパティだろう。
空文字列が入っていた場合の挙動は知らない(汗)。MonoDevelop上では、EXEファイルのある位置になったし。以下のコードを試してみるといい。

using System;
using System.Windows.Forms;

class X{
public static void Main(){
OpenFileDialog ofd1 = new OpenFileDialog();
//ofd1.RestoreDirectory = true;
System.Console.WriteLine(System.Environment.CurrentDirectory);
ofd1.ShowDialog();
System.Console.WriteLine(System.Environment.CurrentDirectory);
ofd1.ShowDialog();
System.Console.WriteLine(System.Environment.CurrentDirectory);

}
}

ただ、Windows 7では設定してもディレクトリが変わらないだの
Bug! This class produces different results depending on the OS(下部、Eiver氏のコメント)
http://msdn.microsoft.com/en-us/library/system.windows.forms.openfiledialog.aspx
FileDialog.AutoUpgradeEnabledがtrueだと、効果がなくなるだのという話もある。
http://social.msdn.microsoft.com/forums/en-US/winforms/thread/73acc356-b724-4362-b972-06eb29619af6/
NyaRuRu氏は.NET Frameworkのソースコードを読む手を提案している。

#一応、Monoは、読みながら書くなよ、と言っているので(ライセンスとか権利関係がややこしくなるし)一応俺はソースを読んでない。
#まぁ正直俺は鳥頭なので、読んでも、どうせすぐ忘れて同じコードなんかかけないと思っていますが。

文字数が足りないので、Monoの動きに関する解説は別のところに置いておく。
難度は高くないが、役に立たない割に長くて面倒くさい内容だ。練習にはなるけどね
https://cid-b89cb784f5346675.office.live.com/self.aspx/TestCase/Q6738744/Q6738744.txt

投稿日時 - 2011-05-18 16:04:01

お礼

またありがとうございます^o^

残りの解説はさっきダウンロードしてきましたが
このページの本文もこれから読んでいきます。

とりあえずは
・ユーザ毎のレジストリに保存されている
・同じユーザーであれば最後に開いた場所を覚えている
・違うマシン、違うユーザなら再びマイドキュメントから
ということですね

軽い気持ちで質問したのですが
プログラムのほうは思った以上に複雑みたいです。

投稿日時 - 2011-05-19 12:22:20

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問