2692


`Button` をクリックするとディレクトリを選択するダイアログを表示し、選択したディレクトリに存在する txt ファイルを `ListBox`
に表示させようと思いました。コードを実行し、無事に指定したディレクトリに存在する txt ファイルを `ListBox` に表示することはできましたが、
`ListBox` に表示されたデータは、`C:\`からはじまる絶対パス付きで表示されています。

以下が書いたコードの一部になります。

[code]

     var Dialog = new CommonOpenFileDialog();
     var Result = Dialog.ShowDialog();
     if (Result == CommonFileDialogResult.Ok)
     {
         var Directory = Dialog.FileName;
         string[] files = System.IO.Directory.GetFiles(Directory, "*.txt");
         listBox1.Items.AddRange(files);
     }
    
[/code]

これを実行すると `ListBox` にパス付きでファイル名が表示されます。どうにか `ファイル名.txt`
のみを表示させたいのですが、うまくいっていません。調べてみたところ、 `GetFileName`を使う方法があるようですが、どうもうまくいきません。

何か方法がありましたら、教えていただけないでしょうか？

※ ちなみにディレクトリの選択するダイアログには、 Windows API CodePack を使用しています。


CC BY-SA 3.0
2014-12-27T10:06:28.003
2686
2014-12-28T13:18:01.873
2014-12-27T11:40:57.900
4978
5798
question
c#
ディレクトリ内の、パスを含まないファイル名だけを ListBox に表示したい


ディレクトリ名が取れているのであれば、DirectoryInfoのGetFilesを呼べば、FileInfoの配列が取得できるので、そこからNameを取ればファイル名が取得できます。

ディレクトリ名がわかっているのであれば以下の様にできます。

[code]

    var directory = "c:\\";
    var x = new System.IO.DirectoryInfo(directory);
    var p = x.GetFiles("*.txt").Select( fileinfo => fileinfo.Name);
    listBox1.Items.AddRange(p.ToArray());
    
[/code]

フルパスが欲しい場合は、fileinfoのFullNameを取得すればフルパスも取得できます。

なお、selectで抽出せずListBoxに設定しても表示は同じ様にファイル名のみですが、
ListBoxに格納されているオブジェクトはFileInfoになります。

[code]

    var directory = "c:\\";
    var x = new System.IO.DirectoryInfo(directory);
    listBox1.Items.AddRange(x.GetFiles("*.txt"));
    
    // 注意：ファイルが見つかっていない場合はエラーになります。
    var obj = (System.IO.FileInfo)listBox1.Items[0];
    MessageBox.Show(obj.FullName);
    
[/code]

後で選択されたアイテムのファイル情報を再利用したい場合など、状況によってはそのままListBoxに設定してしまう方が便利な場合もありますので、うまく使い分けてください。


CC BY-SA 3.0
2014-12-27T10:16:34.467
2687
2014-12-27T10:23:14.960
2014-12-27T10:23:14.960
728
728
2686
answer


ＬＩＮＱを使って以下のように修正すればいいかと思います。

[code]

    string[] files = System.IO.Directory.GetFiles(Directory, "*.txt").Select(x => System.IO.Path.GetFileName(x)).ToArray();
    
[/code]


CC BY-SA 3.0
2014-12-27T10:31:17.123
2688
2014-12-27T10:31:17.123
5044
2686
answer


Linqを使用する場合、Directory.EnumerateFilesを使うと効率的です。
ListBox.AddRangeは、配列を受け取るため、ToArrayでファイル名の一覧の配列を生成します。

[code]

    listbox.AddRange( 
      Directory.EnumerateFiles( @"c:\files" , "*.txt" )
          .Select( Path.GetFileName ) // ファイルパスからファイル名を抽出
          .ToArray()                  // 配列に変換
    );
    
[/code]


CC BY-SA 3.0
2014-12-27T10:44:27.573
2690
2014-12-28T13:18:01.873
2014-12-28T13:18:01.873
30
2207
2686
answer

[code]

    var directoryInfo = new DirectoryInfo(dialog.FileName);
    listBox1.DataSource = directoryInfo.GetFiles("*.txt");
    listBox1.DisplayMember = "Name";
    
[/code]

こんな方法もあります。listBox1にはFileInfo配列を渡し、FileInfoクラスのNameプロパティを画面に表示するように指示できます。この場合、listBox1.SelectedItemプロパティはFileInfoインスタンスを指すようになるので、その後の処理が楽になります。  
なお、変数名は先頭を小文字にしましょう。（listBox1もその命名規則に従っています。）


CC BY-SA 3.0
2014-12-27T10:55:01.693
2692
2014-12-27T23:29:06.643
2014-12-27T23:29:06.643
4236
4236
2686
answer