【C#】ファイル・ディレクトリ関連util | ツール・シミュレータ

ツール・シミュレータ

ツール・シミュレータ等のプログラミングをネタとしてブログ。

 

  1.はじめに

よくツールを作るときにファイル操作関連のライブラリがあると便利でした。

①ファイル検索

 フィルタや再帰関連をよく使う。

②ファイル存在チェック

 ファイル存在チェックは大体1行で書けますが、ツール作っているとそのあと実施するのは「例外投げるだけ」とかなのでよく使います。

 

 

  2.ソース

 

 

namespace IOUtil;

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;

/// <summary>
/// ファイル系util
/// </summary>
public class FileUtil
{
    /// <summary>
    /// ファイル存在チェック
    /// </summary>
    /// <param name="path">チェックするパス</param>
    public static void ExistsWithExp(string path)
    {
        ExistsWithExp(new List<string>{path});
    }

    /// <summary>
    /// ファイル存在チェック
    /// </summary>
    /// <param name="paths">チェックするパス</param>
    public static void ExistsWithExp(List<string> paths)
    {
        paths.ForEach(p => {
            if(!File.Exists(p)) throw new FileNotFoundException("ファイルがありません:" + p);
        });
    }

    /// <summary>
    /// ファイル検索
    /// </summary>
    /// <param name="d">ディレクトリ</param>
    /// <param name="filter">取得条件</param>
    /// <returns>ファイルのリスト</returns>
    public static List<string> Find(string d,Predicate<string> filter)
    {
        DirectoryUtil.ExistsWithExp(d);
        return Directory.GetFiles(d).Where(p => filter(p)).ToList();
    }

    /// <summary>
    /// ファイル検索
    /// </summary>
    /// <param name="d">ディレクトリ</param>
    /// <returns>ファイルリスト</returns>
    public static List<string> Find(string d)
    {
        return Find(d,FileFilter.All());
    }

    /// <summary>
    /// ファイル検索(再帰)
    /// </summary>
    /// <param name="d">ディレクトリ</param>
    /// <returns>ファイルリスト</returns>
    public static List<string> RecurFind(string d)
    {
        return RecurFind(d,FileFilter.All());
    }

    /// <summary>
    /// ファイル検索(再帰)
    /// </summary>
    /// <param name="d">ディレクトリ</param>
    /// <param name="filter">取得条件</param>
    /// <returns>ファイルリスト</returns>
    public static List<string> RecurFind(string d,Predicate<string> filter)
    {
        return
            DirectoryUtil
            .RecurFind(d)
            .Aggregate(new List<string>(),(acc,t) => {
                acc.AddRange(Find(t,filter));
                return acc;
            })
            .ToList();
    }
}

/// <summary>
/// ファイルフィルタ
/// </summary>
public class FileFilter
{
    /// <summary>
    /// フィルタ無し
    /// </summary>
    /// <returns>true</returns>
    public static Predicate<string> All()
    {
        return t => true;
    }

    /// <summary>
    /// ファイル名正規表現
    /// </summary>
    /// <param name="r">正規表現</param>
    /// <returns>フィルタ関数</returns>
    public static Predicate<string> FileReg(string r)
    {
        return t => Regex.IsMatch(Path.GetFileName(t),r);
    }

    /// <summary>
    /// フルパス正規表現
    /// </summary>
    /// <param name="r">正規表現</param>
    /// <returns>フィルタ関数</returns>
    public static Predicate<string> FullReg(string r)
    {
        return t => Regex.IsMatch(t,r);
    }

    /// <summary>
    /// 拡張子
    /// </summary>
    /// <param name="s">拡張子</param>
    /// <returns>フィルタ関数</returns>
    public static Predicate<string> Extension(string s)
    {
        return t => t.EndsWith("." + s);
    }
}

/// <summary>
/// ディレクトリ系util
/// </summary>
public class DirectoryUtil
{
    /// <summary>
    /// ディレクトリ存在チェック
    /// </summary>
    /// <param name="path">ディレクトリ</param>
    public static void ExistsWithExp(string path)
    {
        ExistsWithExp(new List<string>{path});
    }

    /// <summary>
    /// ディレクトリ存在チェック
    /// </summary>
    /// <param name="paths">ディレクトリ</param>
    public static void ExistsWithExp(List<string> paths)
    {
        paths.ForEach(p => {
            if(!Directory.Exists(p)) throw new DirectoryNotFoundException("ディレクトリがありません:" + p);
        });
    }

    /// <summary>
    /// ディレクトリ検索
    /// </summary>
    /// <param name="d">ディレクトリ</param>
    /// <returns>ディレクトリリスト</returns>
    public static List<string> Find(string d)
    {
        ExistsWithExp(d);
        return Directory.GetDirectories(d).ToList();
    }

    /// <summary>
    /// ディレクトリ検索(再帰)
    /// </summary>
    /// <param name="d">ディレクトリ</param>
    /// <returns>ディレクトリリスト</returns>
    public static List<string> RecurFind(string d)
    {
        List<string> ds = Find(d);
        if(ds.Count == 0)
        {
            return new List<string>{d};
        }
        else
        {
            return ds.Aggregate(new List<string>(),(acc,d) =>
            {
                acc.AddRange(RecurFind(d));
                return acc;
            });
        }
    }
}