ファイル名からフルパスを取得 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 (削除されました)  () 投稿日時 2011/7/23 22:31:40
(削除されました)
投稿者 (削除されました)  () 投稿日時 2011/7/23 22:08:02
(削除されました)
投稿者 るきお  (社会人) 投稿日時 2011/7/10 08:02:53
CSVは次のような内容で合っていますか?
日本,C:\Japan\Japan.pdf
カナダ,C:\Canada\Canada.pdf
アメリカ,C:\America\America.pdf
メキシコ,C:\Mexico\Mexico.pdf


ListBoxには「日本」や「カナダ」を表示して、後でその横にあるフルパスも取得したいということですよね?

で、あればshuさんの方法でOKですが、
私の最初の例の読み込み元をC:\WindowsではなくこのCSVファイルに変更するのでもOKなので参考に書いておきますね。


Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    'CSVの行をそれぞれ、1項目目と2項目目に分解してコレクション化。 
    '例:lins(2).Items1 でCSVの3行目の1項目目が取得できるようになる。 
    Dim lines = From csvLine In IO.File.ReadAllLines("C:\vb\test.csv")
                Let items = Split(csvLine, ",")
                Select New Tuple(Of StringString)(items(0), items(1))

    '1項目目をListBoxに表示するように指定。(この時点ではまだ表示はされない。) 
    ListBox1.DisplayMember = "Item1"

    'ListBoxにCSVの行を表示。 
    ListBox1.Items.AddRange(lines.ToArray)
End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

    '選択されている項目がかわったら、その項目(=CSVの行)の2項目目を表示する。 
    MsgBox(ListBox1.SelectedItem.Item2)

End Sub
投稿者 shu  (社会人) 投稿日時 2011/7/9 22:35:10
こんな感じですかね。
Button1クリックでリストに設定していますが、ファイルからの読み込み部分は
文字列配列からの読み込みに置き換えてます。

    Private Class clsItem
        Public Property Title As String
        Public Property FullPath As String
    End Class

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim src = {"aaa,C:\temp\a.text", "bbb,D:\b.text", "ccc,E:\ddd.text", "dddd,C:\Temp\sub\b.text"}
        Dim lst As New List(Of clsItem)

        For Each line In src
            Dim items = line.Split(","c)
            Dim itm = New clsItem With {.Title = items(0), .FullPath = items(1)}

            lst.Add(itm)
        Next
        ListBox1.DataSource = lst
        ListBox1.DisplayMember = "Title"
    End Sub

    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
        Dim itm = DirectCast(ListBox1.SelectedItem, clsItem)

        Label1.Text = itm.Title
        Label2.Text = itm.FullPath
    End Sub
投稿者 yama  (社会人) 投稿日時 2011/7/9 19:35:15
度々申し訳御座いません。
以下、現在のソースになります。

    Private Sub View_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles View.Click


        If System.IO.File.Exists("C:\VB\Test.csv") = True Then

            Try
                Dim CSVFile As New System.IO.StreamReader("C:\VB\Test.csv", System.Text.Encoding.GetEncoding("Shift-JIS"))
                Dim Items() As String
                Dim Line As String = CSVFile.ReadLine
                Dim Title As String

                ListBox1.Items.Clear()
                Do Until IsNothing(Line)

                    Items = Line.Split(",")
                    Title = Items(0)
                    Line = CSVFile.ReadLine

                    If ListBox1.Items.Add(Title) >= 1000 Then


                        MessageBox.Show("1000を超えています。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        Me.Close()
                        Exit Do

                    End If

                Loop

                CSVFile.Close()

            Catch ex As Exception

                MessageBox.Show("エラー", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)

            End Try

        Else

            MessageBox.Show("エラー", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)


        End If

    End Sub

投稿者 yama  (社会人) 投稿日時 2011/7/9 19:26:28
るきおさんありがとうございます

 大変、申し訳ございません。
 ListBoxに表示したいものはTest.txtの中身になります。 

 以下を作成しております。
 CSVファイルへタイトル名、PDFファイルのフルパス等を記入し、
 ListBoxへタイトル名を表示、ListBoxへ表示したタイトルを選択すると
 WebBrowserへPDFファイルを表示するBookReaderを作成しております。
 

 現在は他者(A氏とします。)に使ってもらう際にTest.csvをC:\VB\につくって下さいと
 指定し、Test.csvを読み込みListBoxへタイトルを表示させていますが、
 A氏がどこのディレクトリにおいてもTest.csvとしていすれば、
 Test.csvの内容を表示出来るようにしたいのです。

 そのような事は出来ますでしょうか。
 自身では思いつかず、質問させて頂きました。


投稿者 るきお  (社会人) 投稿日時 2011/7/9 19:06:15
>「C:\VB\」はどこから持ってきますか?
これが質問の本旨かもしれないと思いましたので追記します。

ListBoxに表示するファイルを取得するときに検索元フォルダーを取得してとっておけば、
あとでフルパスが必要な時にフォルダーのパスを取得することができます。
下の例では変数targetFolderに検索元フォルダーをとっておいています。

Dim targetFolder As IO.DirectoryInfo

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

    '検索元フォルダーを取得 
    targetFolder = New IO.DirectoryInfo("C:\Windows")

    'ファイル名をListBoxに表示 
    For Each file As IO.FileInfo In targetFolder.GetFiles
        ListBox1.Items.Add(file.Name)
    Next

End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

    '検索元フォルダーのパスとListBoxの項目を \ でつなげて表示 
    MsgBox(targetFolder.FullName & "\" & ListBox1.SelectedItem)

End Sub


検索元フォルダーが複数ある場合は、保存用の変数を用意したりアクセスするのが面倒なのでListBoxの機能を使用して簡単に管理することができます。
投稿者 るきお  (社会人) 投稿日時 2011/7/9 18:46:50
こんにちは。

ファイル名からフルパスを取得とはどういうことでしょうか?
たとえば、
Test.txt というファイルがあったとして、
C:\VB\Test.txt を取得したいということだと思いますが、
「C:\VB\」はどこから持ってきますか?

とりあえず、C:\Windows\にあるすべてのファイルのファイル名をListBox1に表示して、選択するとフルパスを表示するサンプルを紹介します。


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

    Dim files = From fullpath In IO.Directory.GetFiles("C:\Windows\")
                Select New Tuple(Of StringString)(IO.Path.GetFileName(fullpath), fullpath)

    ListBox1.DisplayMember = "Item1"
    ListBox1.Items.AddRange(files.ToArray)


End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

    MsgBox(ListBox1.SelectedItem.Item2)

End Sub


投稿者 yama  (社会人) 投稿日時 2011/7/9 18:10:56
はじめて質問させて頂きます。
現在、WindowsXP,VB2010にてシステムを作成しております。

現在はフルパスからファイルの情報を取得し、ListBoxへ表示おります。
ファイル名からフルパスを取得し、ListBoxへ表示させたいのですが
やり方、ヒント等御座いましたら、教えて頂ければ幸いです。

分かりづらい文章で申し訳御座いませんが、よろしくお願いいたします。