FolderBrowserDialogでフォルダを選択し、正しいパスを取得する方法

このQ&Aのポイント
  • FolderBrowserDialogを使用してフォルダを選択し、選択されたフォルダのパスを正しく取得する方法について紹介します。
  • 選択したフォルダパスに固定ファイルを出力する際、文字列連結によってフルパスを作成することがあります。しかし、Cドライブ直下ではパスが正しくならず、円マークが2つになってしまいます。この問題を解決する方法を説明します。
  • 解決策としては、FolderBrowserDialog.SelectedPathプロパティで取得したフォルダパスにPath.Combineメソッドを使用して固定ファイル名を連結することが有効です。これにより、正しいパス形式でファイルを出力することができます。
回答を見る
  • ベストアンサー

FolderBrowserDialogの使い方

こんにちは!FolderBrowserDialogについてお教えいただけないでしょうか? 下記のコードを実行しました。 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'FolderBrowserDialogクラスのインスタンスを作成 Dim fbd As New FolderBrowserDialog '上部に表示する説明テキストを指定する fbd.Description = "フォルダを指定してください。" 'ルートフォルダを指定する 'デフォルトでDesktop fbd.RootFolder = Environment.SpecialFolder.Desktop '最初に選択するフォルダを指定する 'RootFolder以下にあるフォルダである必要がある fbd.SelectedPath = "C:\Windows" 'ユーザーが新しいフォルダを作成できるようにする 'デフォルトでTrue fbd.ShowNewFolderButton = True 'ダイアログを表示する If fbd.ShowDialog(Me) = DialogResult.OK Then '選択されたフォルダを表示する Console.WriteLine(fbd.SelectedPath) End If ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' デスクトップを選択すると、「C:\Users\owner\Desktop」、 Cドライブを選択すると、「C:\」となります。 フォルダを選択した後に、「abc.txt」という固定ファイルを出力させようと思っています。とりあえずは、文字列連結をしてフルパスを作成します。 選択したフォルダパスに「"\abc.txt"」と文字列連結すると、「C:\Users\owner\Desktop\abc.txt」になります。 これは、OKです。 しかし、「Cドライブ直下では、「C:\\abc.txt」となってしまい、円マークが2つできてしまいます。 これだと正しいパスにファイルを出力することができないと思います。 これを解決するには、つまり「C:\abc.txt」にするには、どのようにコードを書いたらいいでしょうか?FolderBrowserDialogは使うものと前提でお願い致します!

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

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

パスの結合には,文字列を連結するのではなく,System.IO.PathクラスのCombineメソッドを利用します。 ※参考URLには.NET 4のMSDNのURLを記述しています。最新版である.NET 4.5のMSDNは解説部分が訳されていないので。

参考URL:
http://msdn.microsoft.com/ja-jp/library/fyy7a5kt(v=vs.100).aspx
fflashing
質問者

お礼

combineメソッドは知りませんでした。これは私がやりたい事にに合致します。助かりました、ありがとうございます。

その他の回答 (1)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

コードは書きませんので自分で調べてください フォルダ取得した時ルートフォルダ選択時だけは特殊な扱いで 末尾に\(バックスラッシュ)が付加されます ですので 選択フォルダが3文字(ドライブの¥選択時) もしくは選択フォルダの末尾文字が¥ だった時は 自前で¥を削除してから\を付けたファイル名を付加する等 工夫する必要があります(いずれの方法でも大した話じゃない) 荒業でいえば 作成後の文字列内の "\\" を "\" の置換するってのでもありかな if分 Length関数 Replace関数 あたりで作成できます

fflashing
質問者

お礼

replaceで置き換えてしまうのは手ですね。アイディアがわきました。ありがとうございます。

関連するQ&A

  • フォルダ設定について知りたいです。

    いきなりですが例です。 例(1): 'SaveFileDialogクラスのインスタンスを作成 Dim sfd As New SaveFileDialog() sfd.FileName = "新しいファイル.html" sfd.InitialDirectory = "C:\" sfd.Filter = _ "HTMLファイル(*.html;*.htm)|*.html;*.htm|すべてのファイル(*.*)|*.*" sfd.FilterIndex = 2 'タイトルを設定する sfd.Title = "保存先のファイルを選択してください" sfd.RestoreDirectory = True sfd.OverwritePrompt = True sfd.CheckPathExists = True 'ダイアログを表示する If sfd.ShowDialog() = DialogResult.OK Then 'Copy System.IO.File.Copy("C:\test.txt", (sfd.Namefile), True) End If という具合に「名前を付けて保存」で指定先をコピーする様には 出来るんですが、これがフォルダの場合・・ 例2: 'FolderBrowserDialogクラスのインスタンスを作成 Dim fbd As New FolderBrowserDialog '上部に表示する説明テキストを指定する fbd.Description = "フォルダを指定してください。" 'ルートフォルダを指定する 'デフォルトでDesktop fbd.RootFolder = Environment.SpecialFolder.Desktop '最初に選択するフォルダを指定する 'RootFolder以下にあるフォルダである必要がある fbd.SelectedPath = "C:\Windows" 'ユーザーが新しいフォルダを作成できるようにする 'デフォルトでTrue fbd.ShowNewFolderButton = True 'ダイアログを表示する If fbd.ShowDialog(Me) = DialogResult.OK Then '選択されたフォルダを表示する System.IO.File.Copy("C:\test.txt", ???????, True) End If 上記の??????が分りません。 指定したフォルダ内にあるファイルを操作したいのですが、 (fbd.SelectedPath),"test.txt"でも怒られます。 どの様にしてソースを書けば良いでしょうか? ※回答はソースコードを必ず書き込んでください。

  • 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で選択したフォルダにフォルダを上書きすることができないのです。アドバイスよろしくお願いします。

  • ファイルコピーの事で質問です。

    質問ですが、 'フォルダセット Dim fbd As New FolderBrowserDialog fbd.Description = "フォルダを指定して下さい。" fbd.RootFolder = Environment.SpecialFolder.Desktop fbd.SelectedPath = Environment.SpecialFolder.Desktop 'コピー System.IO.File.Copy(fbd.SelectedPath & "\test.pak", System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles) & "\test.pak") フォルダを選択した後、 そのフォルダ内の「test.pak」をコピーして、 プログラムファイルを取得して、取得した先の場所に保存したいのですが、 これをデバッグすると、怒られてしまいます。 "(C:\Program File\test.pak) の一部が見つかりませんでした" という怒られ内容です。 ドコモ間違ってないのに、この様なエラーが出てしまうのですが 何処が悪いのでしょうか?どの様な改善をすれば良いでしょうか?

  • 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

  • 言語[C#]..フォルダ選択ダイアログで、フォルダ選択のための階層が表示されない

    C#を使い、フォルダ選択のダイアログを表示させたいと思っています。WEB上に公開されていた下記コードを使い、フォルダ選択のダイアログを表示できました。 ただ、ダイアログが表示されたのはよいのですが、ダイアログ内に表示されるはずの、フォルダ選択のための階層部分が表示されません。この現象についてご存知の方、助言を頂きたくお願い致します。 また、C#は一昨日から使い初めたばかりです。初歩的なミスであった時は、どうぞお許し下さい。 フォルダ選択ダイアログの表示コード ------------------------------------------------ FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd.Description = "読み込むフォルダを指定してください" ; if (fbd.ShowDialog() == DialogResult.OK) { txtInputFolder.Text = fbd.SelectedPath ; } ------------------------------------------------

  • 文字列の最後の文字取得

    またまたお世話になります。 Microsoft Visual Basic 2008 Express Editionを使ってます。 MyFolder.Description = "フォルダを指定してください" MyFolder.RootFolder = System.Environment.SpecialFolder.Desktop MyFolder.SelectedPath = "C:\Program Files" If  MyFolder.ShowDialog() = DialogResult.OK  Then   If  ???= "\"  Then    NewMyFolder = MyFolder.SelectedPath  &  "test"   Else    NewMyFolder = MyFolder.SelectedPath  &  "\test"   End If End If MyFolder.Dispose() MkDir(NewMyFolder)←? Label2.Text = NewMyFolder ダイアログで選択してそこにtestフォルダを作成したいのですが。。。 MyFolder.SelectedPathが "C:\Program Files"の場合(例) "D:\"の場合(例) 文字列の最後の文字を取得したいのですが ???の部分がわかりません。 Rigthは使えませんでした。 ???の部分を教えてください。

  • 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 ------------------------------------------------------- 以上  宜しくお願い致します。(^@^)

  • 日付順にテキストを開いて書き込むエクセルマクロ

    あるフォルダの中に「abc#1xyz_201308.txt」という形のテキストファイルがあり、 ボタンを押すと、直近1年分のファイルに対して中身のデータをシート3に書き込むような マクロを作りたいのですが、直近1年分のものに対して所定の操作を行うやり方が分かりません 例として、「C:\Users\Owner\Documents」に「abc#1xyz_201308.txt」の形のファイルが 1年以上分ある場合で教えていただけますか? (テキストは日付以外は同じ名前、つまりabc#1xyz_201307.txtやabc#1xyz_201306.txtが存在し それ以外の名前のものはこのフォルダにはありません。またフォルダ内には順番通り入っていませんが シートに書き込むのは古いものから順にしたいです)

  • デスクトップ上の表示を「owner」に戻したい。

    パソコン初心者です。 あまりパソコン用語等に詳しくないのですが、よろしくお願いいたします。 デスクトップ上で新しいフォルダを作成し、「ABC」(仮称)に名前を変更したところ、 気が付いたら、 元からデスクトップにあったアイコン「owner」の名称が「ABC」になっていました。 名称が変わった原因は解りません。(申し訳ございません。) Windowsボタンで立ちあがるメニューの表示も「owner」から「ABC」に変わっています。 元ownerの「ABC」のアイコンを右クリックしても、「名前の変更」がありません。 この、元ownerの「ABC」の名称を元の「owner」に戻したいのですが、 どうすればよろしいでしょうか。 必要と思われる情報を下に列記します。 足りない情報等がございましたらお尋ねください。解る範囲で調べてお答えしたいと思います。 デスクトップには作成したフォルダ「ABC」も存在します。 中身もフォルダ「ABC」の作成時のままです。 元ownerの「ABC」の中身(アドレス帳、ピクチャ、お気に入り等)をざっと確認したところ、 「owner」のときのまま、 保存していた画像ファイル、お気に入り(ブックマーク)等に変更はないようです。 コンピュータからC:ユーザーに入ってみたところ、 「owner」と「パブリック」のフォルダがあり、 この「owner」の中身と 元ownerの「ABC」(デスクトップ上)の中身は同じ(連動している)ようです。 (試しに、新たにお気に入りを追加したところ、どちらにもお気に入りが追加されていました。削除も同様でした。) また、ユーザーアカウントを調べたところ、「owner」のままでした。 パソコンはVistaです。 個人のノートパソコンなので、ログイン名等の設定はせず「owner」のまま使用しております。 よろしくお願いいたします。

  • 参照ファイルを用いて、複数のテキスト置換を一括で行

    参照ファイル(list.txt)を用いて、一括でファイルの中身(test.txt)を置換したいです。以下のようにワンライナーで書いたのですが、以下のようなエラーが出ました。 使っているのはMac Os10.15.5です。 何か問題があるのでしょうか? 間違っている点があれば教えていただきたいです。 sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' list.list | xargs -I{} sed -i '{}' test.txt sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o <list.txt> AAA aaa 111 222 abc efg ....