リストボックスで複数選択したファイルをFDにコピーするには?


じーん  2010-03-17 02:37:41  No: 102301

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


魔界の仮面弁士  2010-03-17 04:08:07  No: 102302

> 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" とでは、
それぞれ別のパスを意味します。


じーん  2010-03-17 19:57:16  No: 102303

魔界の仮面弁士様

早速,教えて下さってありがとうございます!
余りの早さに感動しました!

ところで,SelectedItem  →  SelectedItems  に変更して
みましたが,やはり複数のファイルを選択しても,最後に
選んだファイルのみしかFDに保存されません。

また,FullPath = FullPaths(ListBox.SelectedIndex)を
削除すると,「ファイルが見つかりませんでした」という
エラーメッセージが出てしまいます。

もし,ほかに,ここがまずいんじゃないかと思いつくことがあったら,
教えていただけないでしょうか?

>"A:\file.txt"と"A:file.txt" とでは、それぞれ別のパスを意味します。
どう違うのかを考えたのですが,さっぱり分かりません。済みませんが、
教えてもらえないでしょうか?

自分でもいろいろうまくいく方法を探しているのですが,
初心者のため,何をどう探していいのか分かりません。


魔界の仮面弁士  2010-03-17 21:44:05  No: 102304

> 最後に選んだファイルのみしか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) その他


魔界の仮面弁士  2010-03-17 21:55:50  No: 102305

>>"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"」にコピーされる。


じーん  2010-03-23 18:16:07  No: 102306

魔界の仮面弁士さま

お返事、ありがとうございます。
お礼が遅くなってしまい,申しわけありません。

教えていただいた通り,ステップ実行をしてみたいと
思いますが,ほかのことで忙しくなってしまい,
しばらくはこれに手をつけられなくなりました。

できるようになったら,すぐにでもやりますので,
そのときはまたヨロシクお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加