Visual Studio | WPF > fileIO > 特定の拡張子のファイルをサブフォルダ全部に対して検索する > GetFiles() または EnumerateFiles()の使用

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### 処理概要

.csvファイルを特定のフォルダ以下の全サブフォルダで探す、ということは時々実施する。

System.IOを使った場合の実装について記載する。

### 参考

[System.IO.Directoryクラス](https://msdn.microsoft.com/ja-jp/library/system.io.directory(v=vs.110).aspx)

[unity / dotnet > Directory.GetDirectories() / Directory.GetFiles()](https://qiita.com/7of9/items/b229e0c55d87f8f11563)

Directory.GetFiles()とDirectory.EnumerateFiles()の二種類が利用できそうだ。

### code

```MainWindow.xaml
<Window x:Class="_171114_t1900_findFile.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171114_t1900_findFile"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Name="B_findFile" Content="Find File" Height="30" Click="B_findFile_Click"/>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// 以下を追加
using System.IO;

namespace _171114_t1900_findFile
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private readonly string kTargetDir = "D:\\FolderSearch_171114";

        private void B_findFile_Click(object sender, RoutedEventArgs e)
        {
            // 1. EnumerateFiles()
            Console.WriteLine("-----");
            IEnumerable<string> fileEmrt = Directory.EnumerateFiles(kTargetDir, "*.csv", SearchOption.AllDirectories);
            foreach(var elem in fileEmrt)
            {
                Console.WriteLine(elem);
            }

            // 2. GetFiles()
            Console.WriteLine("-----");
            string[] fileGtfl = Directory.GetFiles(kTargetDir, "*.csv", SearchOption.AllDirectories);
            foreach(var elem in fileGtfl)
            {
                Console.WriteLine(elem);
            }
        }
    }
}
```

`SearchOption.AllDirectories`としているが、フォルダ単体の場合は`SearchOption.TopDirectoryOnly`とする。

### 対象フォルダ例

`D:\FolderSearch_171114`は以下となっている。

```
┣DIR_A
┃  ┣171010.csv
┃  ┣171010.json
┃  ┣171011.csv
┃  ┣171011.json
┃  ┣171012.csv
┃  ┣171012.json
┗DIR_B
    ┣171110.csv
    ┣171110.json
    ┣171111.csv
    ┣171111.json
    ┣171112.csv
    ┗171112.json
```

### 実行例

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a6a4bcbc-6545-5b62-1d3d-748cf9a28847.png)

### どちらを使うか?

[階層が深いフォルダ内のファイル検索は EnumerateFiles メソッドが早い！](https://qiita.com/otagaisama-1/items/defebedf14b7e788751a)
> System.IO.Directory.GetFiles(path, pattern, System.IO.SearchOption.AllDirectories) メソッドがありますが、こちらはすべてを列挙しつくすまでメソッドを抜けないため時間がかかりますし、一気に結果を返すので検索処理中にはメモリをそれなりに消費します。

EnumerateFiles()の方が良いかもしれない。