VB2008です。
リストボックスに,あるフォルダに入れてあるファイルの
ファイル名を表示しています。
このリストボックスで選択したファイルをAドライブのFDに
コピーするものを作成しています。
選択したファイルが1つだけの場合はうまくいくのですが,
ファイルを複数選択した場合にはうまくいきません。
For Eeach の使い方がまずのでしょうか?
どなたか分かる方,教えて下さい。よろしくお願いします。
今,作成しているソースは以下の通りです。
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
Dim FullPaths As New ArrayList
Dim FullPath As String
Dim Filename As String
For Each FullPath In ListBox.SelectedItem
FullPath = FullPaths(ListBox.SelectedIndex)
Filename = IO.Path.GetFileName(FullPath)
IO.File.Copy(FullPath, "A:" & Filename, True)
Next
End Sub
> For Each FullPath In ListBox.SelectedItem
SelectedItem は、選択された項目をひとつだけ返します。複数選択なら
SelectedItems を使うことで、すべての選択項目を拾い出せます。
> FullPath = FullPaths(ListBox.SelectedIndex)
この行は不要だと思います。
For Each によって、既に変数 FullPath には「選択された項目」が格納されて
いますので、それを別の値に書き換えてしまっては意味が無いかと。
> IO.File.Copy(FullPath, "A:" & Filename, True)
"A:\file.txt" と
"A:file.txt" とでは、
それぞれ別のパスを意味します。
魔界の仮面弁士様
早速,教えて下さってありがとうございます!
余りの早さに感動しました!
ところで,SelectedItem → SelectedItems に変更して
みましたが,やはり複数のファイルを選択しても,最後に
選んだファイルのみしかFDに保存されません。
また,FullPath = FullPaths(ListBox.SelectedIndex)を
削除すると,「ファイルが見つかりませんでした」という
エラーメッセージが出てしまいます。
もし,ほかに,ここがまずいんじゃないかと思いつくことがあったら,
教えていただけないでしょうか?
>"A:\file.txt"と"A:file.txt" とでは、それぞれ別のパスを意味します。
どう違うのかを考えたのですが,さっぱり分かりません。済みませんが、
教えてもらえないでしょうか?
自分でもいろいろうまくいく方法を探しているのですが,
初心者のため,何をどう探していいのか分かりません。
> 最後に選んだファイルのみしかFDに保存されません。
「複数の項目を列挙すること」に失敗しているのか、
「ファイルをコピーする段階」で失敗しているのかを確認するために、
それぞれの変数の変化を、ステップ実行で追ってみてください。
> また,FullPath = FullPaths(ListBox.SelectedIndex)を
SelectedIndex は、複数選択であろうとなかろうと、
選択項目の「最初の番号」を Integer で返すだけです。
複数の項目番号を列挙したいなら、複数形のプロパティ名である
SelectedIndecies を使ってください。こちらであれば、
Integer の配列として複数の値を受け取る事ができます。
ただ、SelectedItems を使っているのであれば、SelectedIndecies を
利用する必要はおそらく無いと思います。
(ListBox の内容が分からないので確証は持てませんが)
> リストボックスに,あるフォルダに入れてあるファイルの
> ファイル名を表示しています。
どのようにして表示させていますか?
(1) フルパスを表す文字列を .Items.Add で登録している
C:\AAAA\BBBB\2010-11-12.TXT
C:\AAAA\BBBB\2010-09-08.TXT
(2) ファイル名のみを示す文字列を .Items.Add で登録している
2010-11-12.TXT
2010-09-08.TXT
(3) フルパスの一覧を .DataSource にバインドしている
(4) ファイル名の一覧を .DataSource にバインドしている。
(5) その他
>>"A:\file.txt"と"A:file.txt" とでは、それぞれ別のパスを意味します。
> どう違うのかを考えたのですが,さっぱり分かりません。
前者は、『A ドライブのルートディレクトリ上の file.txt』を意味し、
後者は、『A ドライブの現在のディレクトリ上の file.txt』を意味します。
--
.NET Framework から離れて、コマンドで操作してみると:
(1) フォーマット済みの空の FD を用意して、
その A ドライブのルートに、空の "test" フォルダを作っておく。
(2) C ドライブのルートに、"sample1.txt" および "sample2.txt" の
2 つのファイルを置いておく。
(3) [Win]+[R]キーで『ファイル名を指定して実行』を表示し、
そこに "cmd.exe" と入力して Enter を押す。
(4) 起動された画面に "A:" と入力して Enter。
→プロンプトが "A:\>" という表示に変化する。
(5) "CD A:\test" と入力して Enter。
→プロンプトが "A:\test>" という表示に変化する。
(6) "COPY C:\sample1.txt A:sample1.txt" と入力して Enter。
(7) "COPY C:\sample2.txt A:\sample2.txt" と入力して Enter。
(8) エクスプローラーで確認すると、それぞれのファイルは
「"A:\sample1.txt" と "A:\sample2.txt"」ではなく、
「"A:\test\sample1.txt" と "A:\sample2.txt"」にコピーされる。
魔界の仮面弁士さま
お返事、ありがとうございます。
お礼が遅くなってしまい,申しわけありません。
教えていただいた通り,ステップ実行をしてみたいと
思いますが,ほかのことで忙しくなってしまい,
しばらくはこれに手をつけられなくなりました。
できるようになったら,すぐにでもやりますので,
そのときはまたヨロシクお願いします。
ツイート | ![]() |