ファイル名からフルパスを取得
投稿者 るきお  (社会人)
投稿日時
2011/7/9 18:46:50
こんにちは。
ファイル名からフルパスを取得とはどういうことでしょうか?
たとえば、
Test.txt というファイルがあったとして、
C:\VB\Test.txt を取得したいということだと思いますが、
「C:\VB\」はどこから持ってきますか?
とりあえず、C:\Windows\にあるすべてのファイルのファイル名をListBox1に表示して、選択するとフルパスを表示するサンプルを紹介します。
ファイル名からフルパスを取得とはどういうことでしょうか?
たとえば、
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 String, String)(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
投稿者 るきお  (社会人)
投稿日時
2011/7/9 19:06:15
>「C:\VB\」はどこから持ってきますか?
これが質問の本旨かもしれないと思いましたので追記します。
ListBoxに表示するファイルを取得するときに検索元フォルダーを取得してとっておけば、
あとでフルパスが必要な時にフォルダーのパスを取得することができます。
下の例では変数targetFolderに検索元フォルダーをとっておいています。
検索元フォルダーが複数ある場合は、保存用の変数を用意したりアクセスするのが面倒なのでListBoxの機能を使用して簡単に管理することができます。
これが質問の本旨かもしれないと思いましたので追記します。
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の機能を使用して簡単に管理することができます。
投稿者 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の内容を表示出来るようにしたいのです。
そのような事は出来ますでしょうか。
自身では思いつかず、質問させて頂きました。
大変、申し訳ございません。
ListBoxに表示したいものはTest.txtの中身になります。
以下を作成しております。
CSVファイルへタイトル名、PDFファイルのフルパス等を記入し、
ListBoxへタイトル名を表示、ListBoxへ表示したタイトルを選択すると
WebBrowserへPDFファイルを表示するBookReaderを作成しております。
現在は他者(A氏とします。)に使ってもらう際にTest.csvをC:\VB\につくって下さいと
指定し、Test.csvを読み込みListBoxへタイトルを表示させていますが、
A氏がどこのディレクトリにおいてもTest.csvとしていすれば、
Test.csvの内容を表示出来るようにしたいのです。
そのような事は出来ますでしょうか。
自身では思いつかず、質問させて頂きました。
投稿者 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
以下、現在のソースになります。
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
投稿者 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
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
投稿者 るきお  (社会人)
投稿日時
2011/7/10 08:02:53
CSVは次のような内容で合っていますか?
ListBoxには「日本」や「カナダ」を表示して、後でその横にあるフルパスも取得したいということですよね?
で、あればshuさんの方法でOKですが、
私の最初の例の読み込み元をC:\WindowsではなくこのCSVファイルに変更するのでもOKなので参考に書いておきますね。
日本,C:\Japan\Japan.pdf
カナダ,C:\Canada\Canada.pdf
アメリカ,C:\America\America.pdf
メキシコ,C:\Mexico\Mexico.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 String, String)(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
投稿者 (削除されました)  ()
投稿日時
2011/7/23 22:08:02
(削除されました)
投稿者 (削除されました)  ()
投稿日時
2011/7/23 22:31:40
(削除されました)
現在、WindowsXP,VB2010にてシステムを作成しております。
現在はフルパスからファイルの情報を取得し、ListBoxへ表示おります。
ファイル名からフルパスを取得し、ListBoxへ表示させたいのですが
やり方、ヒント等御座いましたら、教えて頂ければ幸いです。
分かりづらい文章で申し訳御座いませんが、よろしくお願いいたします。