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

このQ&Aのポイント
  • vb.netのOpenFileDialogでダイアログを開いたとき、最初はマイドキュメントが表示されますが違うフォルダからファイルを選ぶと、次にダイアログを開いたときはそのフォルダ(カレントフォルダ?)がまず表示されます。その情報はどこに保存されてるのですか?
  • 同じパソコンでプログラムをコピーして交互に動かしてもカレントフォルダはその度に変わってるようです。別のパソコンにプログラムをコピーしたら(最初だけは)マイドキュメントからになるんですか?
  • RestoreDirectoryプロパティにtrueを設定してもカレントフォルダは変わるようなのですがなぜでしょう?
回答を見る
  • ベストアンサー

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

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 --------------------

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

  • ベストアンサー
回答No.1

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

trap1130
質問者

お礼

またありがとうございます^o^ 残りの解説はさっきダウンロードしてきましたが このページの本文もこれから読んでいきます。 とりあえずは ・ユーザ毎のレジストリに保存されている ・同じユーザーであれば最後に開いた場所を覚えている ・違うマシン、違うユーザなら再びマイドキュメントから ということですね 軽い気持ちで質問したのですが プログラムのほうは思った以上に複雑みたいです。

関連するQ&A

  • VBで選択したフォルダにフォルダをコピーしたい

    VBで、選択したフォルダに、中身の入ったフォルダを上書きしてコピーするプログラムを作りたいと思い、フォルダを選択し、選択したフォルダをラベルに表示させるというところまではできました。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fbd As New FolderBrowserDialog fbd.Description = "フォルダを指定してください。" fbd.RootFolder = Environment.SpecialFolder.Desktop fbd.SelectedPath = "C:\Windows" fbd.ShowNewFolderButton = True If fbd.ShowDialog(Me) = DialogResult.OK Then Console.WriteLine(fbd.SelectedPath) Label3.Text = fbd.SelectedPath End If End Sub ですが、ここから試行錯誤を繰り返してみるも、FolderBrowserDialogで選択したフォルダにフォルダを上書きすることができないのです。アドバイスよろしくお願いします。

  • VB2008でSMTPコードを用いて添付ファイルをメールで送るコードについて

    いつもお世話になります。 ファイルを選択して、添付ファイルとしてメールを送りたいと考えております。デバックをするとエラーがないのですが、ボタンをクリックし、ファイルを選択すると指定されたパスのフォーマットはサポートされていません と表示されます。 ファイルを添付しないと、問題なく送る事が出来ます。 Imports System.Net.Mail Public Class メール送信 Public msg As New MailMessage() Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '宛先の確認 Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged msg.From = New MailAddress("xxxxx@aaaa.co.jp", "●○サポート") msg.To.Add(New MailAddress("wwww@bbbbb.co.jp", "xxx課長")) If CheckBox1.Checked = True Then MessageBox.Show(CheckBox1.Text & "が選択されました。", "選択メッセージ")Else MessageBox.Show(CheckBox1.Text & "が解除されました。", "解除メッセージ")  End If End Sub Dim Ret As DialogResult 'ダイアログボックスの初期設定 With OpenFileDialog1 .Title = "ファイルの" .CheckFileExists = True .RestoreDirectory = True End With 'ダイアログボックスを表示し、'[開く]ボタンがされたらファイル名を表示 Ret = OpenFileDialog1.ShowDialog() If Ret = Windows.Forms.DialogResult.OK Then TextBox2.Text = "ファイル名:" _ & OpenFileDialog1.FileName Else TextBox2.Text = "" End If msg.Attachments.Add(New Attachment(TextBox2.Text))  End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click 'SMTPサーバーの指定 Dim client As New SmtpClient("SMTPサーバ") '送信元の設定 msg.From = New MailAddre("xxxxx@aaaa.co.jp", "●○サポート") Try ' メール送信 client.Send(msg) MessageBox.Show("送信しました!") Catch ex As SmtpException ' SMTPサーバーへの接続に失敗した場合 MessageBox.Show("送信出来ませんでした!") End Try End Sub End Class 上記がコードになります。 ファイルのパスをコードで記入するのではなくて、ボタンを押した際に 選択したファイルを添付ファイルとして送りたいと考えております。 お忙しい所ご迷惑をお掛けしますが、 ご教授頂けないでしょうか? 私事で恐縮ですが、早めにご回答頂けると助かります。 最後まで長文、乱文を読んで頂きありがとうございました。 以上、宜しくお願い申し上げます。

  • VB.NRT FolderBrowserDialogを使用して、選択したフォルダ内のファイルを表示させるには?

    VB.NET初心者です。 ネットで調べてFolderBrowserDialogを使用して、フォルダを表示させ、フォルダのパスを取得するところまではできたのですが、フォルダの中のファイルを表示させるには、どうしたらよいのでしょうか? OpenFileDialogクラスを使えば、ファイルは表示できるようですが、ファイルの入っているフォルダのパスだけ取ってきたい(複数ファイルを一度に読みこむため)のですが、何か良い手はありませんでしょうか? また、FolderBrowserDialog使用で前回選択したフォルダを次にダイアログを開いたときにも表示させることは可能でしょうか? よろしくお願いいたします。 Dim fbd As FolderBrowserDialog = New FolderBrowserDialog() fbd.Description = "フォルダを指定してください。" If fbd.ShowDialog() = DialogResult.OK Then Console.WriteLine(fbd.SelectedPath) End If Dim folder As String = fbd.SelectedPath Dim serchpattern As String = "*.txt" Dim files As New ArrayList 'フォルダ名格納 Get_FPath(folder, serchpattern, files) End Sub

  • VBでデバックするとエラーになる。

    VBでデバックすると下のようなエラーがでます ArgumentNullExceptionはハンドルされませんでした。 値を Null にすることはできません。 パラメーター名: activationContext VBを初めて日が浅いのでヘルプを読んでも意味が理解できませんでした。 なので、易しく回答してもらえると嬉しいです コードは下です Public Class Form1 'TextBox2に入力したURLをWebBrowser1で表示する Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click WebBrowser1.Navigate(TextBox2.Text) End Sub 'ブラウザ→戻るでWebBrowser1を処理する Private Sub 戻るToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 戻るToolStripMenuItem.Click WebBrowser1.GoBack() End Sub 'ブラウザ→進むでWebBrowser1を処理する Private Sub 進むToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 進むToolStripMenuItem.Click WebBrowser1.GoForward() End Sub 'ブラウザ→テキストボックスにURLを入力した時の処理 Private Sub ToolStripTextBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripTextBox1.Click WebBrowser1.Navigate(ToolStripTextBox1.Text) End Sub 'TextPageのタブをクリックした時のイベント Private Sub TabPage1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage1.Enter TextBox2.Visible = False Button1.Visible = False ブラウザToolStripMenuItem.Enabled = False 書式ToolStripMenuItem.Enabled = True ToolStripMenuItem1.Enabled = True End Sub 'BrowserPageのタブをクリックした時のイベント Private Sub TabPage2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage2.Enter TextBox2.Visible = True Button1.Visible = True ブラウザToolStripMenuItem.Enabled = True 書式ToolStripMenuItem.Enabled = False ToolStripMenuItem1.Enabled = False End Sub Private Sub 新規ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新規ToolStripMenuItem.Click TextBox1.Text = ("") End Sub Private Sub 開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = OpenFileDialog1.ShowDialog() filename = OpenFileDialog1.FileName If selectButton = DialogResult.OK Then Try TextBox1.Text = _ My.Computer.FileSystem.ReadAllText(filename, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub 保存ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 保存ToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = SaveFileDialog1.ShowDialog() filename = SaveFileDialog1.FileName If selectButton = DialogResult.OK Then Try My.Computer.FileSystem.WriteAllText(filename, TextBox1.Text, False, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub フォントToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles フォントToolStripMenuItem.Click Dim fd As New FontDialog() fd.Font = TextBox1.Font fd.Color = TextBox1.ForeColor fd.MaxSize = 19 fd.MinSize = 8 fd.FontMustExist = True fd.AllowVerticalFonts = False fd.ShowColor = True fd.ShowEffects = True fd.FixedPitchOnly = False fd.AllowVectorFonts = True If fd.ShowDialog() <> DialogResult.Cancel Then 'TextBox1のフォントと色を変える TextBox1.Font = fd.Font TextBox1.ForeColor = fd.Color End If End Sub End Class

  • 重複した文字列をカウントして取り出したい

    初めて質問させていただきます。 VB初心者です。 ソートされた文字列の書き込まれたファイルを読み、 (文字列は、 ”000” ”001” ”001” ”001” ”002” ”002” ”003” といったように書き込まれています。) そこから、3つ連続して並んでいる文字列を探し出して、 その文字列と、3つ連続していた文字列がいくつあったのか表示するプログラムを作りたいのですが、 どうにも処理速度が遅く、さらに行数が1万を超えると、応答なしになってしまいます。 どなたか、上手い処理の方法があれば、ぜひともご教授の程をお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click OpenFileDialog1.FileName = "" OpenFileDialog1.InitialDirectory = "c:\" If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then TextBox1.Text = My.Computer.FileSystem.ReadAllText _ (OpenFileDialog1.FileName, System.Text.Encoding.Default) End If End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim x As Integer Dim xyz As Integer '行数を調べる。 Dim i As Integer = TextBox1.Lines.Length TextBox2.Text = (i - 1 & "行") MessageBox.Show("一時停止") For ix = 0 To i - 2 '1行目と2行目を比較 If TextBox1.Lines(x) = TextBox1.Lines(x + 1) Then '2行目と3行目を比較 If TextBox1.Lines(x + 1) = TextBox1.Lines(x + 2) Then '3つある番号を記入。 TextBox2.Text = TextBox2.Text + vbCrLf + TextBox1.Lines(x + 2) '3回重複したことをカウント。 'MessageBox.Show("3発見") xyz = xyz + 1 Else End If Else End If '調べる行を+1 x = x + 1 Next TextBox2.Text = TextBox2.Text + vbCrLf + ("3つ以上は、" & xyz & "個") End Sub Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub End Class

  • form2がボタンを押すと消えてしまう

    vb2010で、作成しています。form1から、form2を呼び出し、okボタンまたは、cancelボタンを押すと、無条件でform2が消えてしまいます。私がしたいのは、form2(パスワード入力ウィンドウ)でテキストボックスにパスワードを入力してokボタンを押して、それが正しい(1234)ときのみform2を消去することです。現在のところ、入力したパスワードが間違っていてもokボタンを押すと、form2は消えてしまいます。 form1側のコードとform2側のコードは以下です。お手数ですが御教示いただけると幸いです。 /////////Form1 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f As New Form2() f.TextBox1.PasswordChar = "*"c '//入力文字をマスクする If f.ShowDialog(Me) = DialogResult.OK Then If f.TextBox1.Text = "1234" Then f.Dispose() End If End If End Sub End Class /////////Form2 Public Class Form2 Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click Dim f As Form1 f = Me.Owner Me.DialogResult = DialogResult.OK End Sub Private Sub btncancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btncancel.Click Dim f As Form1 f = Me.Owner Me.DialogResult = DialogResult.Cancel End Sub End Class

  • 音声アラームの追加について

    素人の質問が以下のとおりです。 音声付のアラームを作っています。 機能として、OpenFileDialogを利用して、選択されたWavもしくmp3ファイルを再生することです。 ソースコードは以下のとおりです。 Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged Call sudAlarm() End Sub Sub sudAlarm() Dim value As String Dim ofd As New OpenFileDialog() ofd.InitialDirectory = "C:\" ofd.Filter = "音声ファイル|*.wav|音声ファイル(*.mp3)|*.mp3" ofd.FilterIndex = 2 ofd.RestoreDirectory = True If ofd.ShowDialog() = DialogResult.OK Then value = ofd.RestoreDirectory My.Computer.Audio.Play(value) 'My.Computer.Audio.Play(value,AudioPlayMode.BackgroundLoop) 'My.Computer.Audio.Stop() End If End Sub 結果は My.Computer.Audio.Play(value)にエラーがあってうまくいけませんでした。 エラー内容は”指定されたファイルが存在していない”ような内容です。 もちろん、ファイルがちゃんとおきました。 以上、宜しくお願いします。

  • VB2010 txtファイルとして保存をする方法

    度々、VBの質問をしています。学習中ですみません。 TextBoxに入力されている文字をテキストファイルとして保存したいのですが、 参考にしているテキストが、Imageファイルだったので途中から分からなくて… どのようにしたら良いのでしょうか? ’OKボタンがクリックされたときに 入力するコードをどなたか教えてください。 フォームにメニューを追加し、その下に名前を付けて保存を入力しています。 Private Sub 名前を付けて保存ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 名前を付けて保存ToolStripMenuItem.Click Dim sfd As New SaveFileDialog 'はじめに表示されるフォルダを指定する sfd.InitialDirectory = "C:\Users\○○\Desktop" '「ファイルの種類」に表示される選択肢を指定する sfd.Filter = "すべてのファイル(*.*)|*.*|テキストファイル(*.txt)|*.txt" '「テキストファイル」が選択されているようにする sfd.FilterIndex = 2 sfd.Title = "保存先のフォルダを選択してください。" sfd.RestoreDirectory = True 'ダイアログボックスを表示する If sfd.ShowDialog() = DialogResult.OK Then 'OKボタンがクリックされたとき End If

  • Visual Basic 2005で困ってます

    「ファイルを開く」ダイアログを表示して 画像ファイルを選択し、そのファイルをPictureboxに表示させたいのですが 画像が表示されずエラーが出てしまいます。 Private Sub 開くOToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くOToolStripMenuItem.Click Dim ofd As New OpenFileDialog() ofd.FileName = ""   ofd.InitialDirectory = "デスクトップ"       ofd.Filter = _ "すべてのピクチャーファイル(*.jpg;*.jpeg)|*.jpg;*.jpeg|すべてのファイル(*.*)|*.*"   ofd.FilterIndex = 2 ofd.Title = "開くファイルを選択してください" ofd.RestoreDirectory = True ofd.CheckFileExists = True ofd.CheckPathExists = True If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then Console.WriteLine(ofd.FileName) lstFileName.Items.Add(ofd.FileName) End If このようなプログラムなのですが どのように変えたらよろしいでしょうか? 教えてください、よろしくお願いします。

  • VB ファイルの検索について

    VB ファイルの検索について こんにちは VB2008でファイルの種類を指定して、検索するプログラムを作っています。 要求: 1ボタンをクリックして、検索対象のフォルダを指定 2事前に決めたファイル種類(*.txt)を検索する 3(*.txt)がある場合はディスクトップにコピーする 今は1ができましたが、2と3について、どうやって書くのかわからないです。 --------------------ソース------------ Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim SourcePath As String Dim fdb As New FolderBrowserDialog With fdb 'Select to Folder and open it .Description = "Please Select Folder" .RootFolder = System.Environment.SpecialFolder.MyComputer SourcePath = TextBox1.Text .SelectedPath = SourcePath If fdb.ShowDialog() = DialogResult.OK Then TextBox1.Text = fdb.SelectedPath End If End With End Sub End Class ------------------------------------------------------- 以上  宜しくお願い致します。(^@^)