LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-14
動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2

処理概要

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

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

参考

System.IO.Directoryクラス

unity / dotnet > Directory.GetDirectories() / Directory.GetFiles()

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

どちらを使うか?

階層が深いフォルダ内のファイル検索は EnumerateFiles メソッドが早い!

System.IO.Directory.GetFiles(path, pattern, System.IO.SearchOption.AllDirectories) メソッドがありますが、こちらはすべてを列挙しつくすまでメソッドを抜けないため時間がかかりますし、一気に結果を返すので検索処理中にはメモリをそれなりに消費します。

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0