連番のファイル名を生成するには


textfile_001.txt のような数字３桁の連番を含んだファイル名を生成したいです。  
単に連番を生成するのではなく、作成先のフォルダ内を検索して同じパターンのファイル名があったら連番の最大値＋１でファイル名を生成したい。

たとえば、フォルダが空の時は、`textfile_001.txt`

フォルダに

> textfile_001.txt  
>  textfile_002.txt

がある時は、`textfile_003.txt`

フォルダに

> textfile_001.txt  
>  datafile_002.dat

がある時は、`textfile_002.txt`（datafile_002.dat はファイル名のパターンが違うので無視）

という感じです。  
どのようにコーディングすればよいでしょうか。




BLUEPIXYさんの回答では

> 連番の最大値＋１でファイル名を生成したい

に答えられていないので、ちょっと修正します。（tagNameが正規表現に反応する+や[]を含んでいた場合も問題ですし。）

[code]

    var di = new DirectoryInfo(Environment.CurrentDirectory);
    var tagName = "textfile";
    var max = di.GetFiles(tagName + "_???.txt")                         // パターンに一致するファイルを取得する
        .Select(fi => Regex.Match(fi.Name, @"(?i)_(\d{3})\.txt$"))      // ファイルの中で数値のものを探す
        .Where(m => m.Success)                                          // 該当するファイルだけに絞り込む
        .Select(m => Int32.Parse(m.Groups[1].Value))                    // 数値を取得する
        .DefaultIfEmpty(0)                                              // １つも該当しなかった場合は 0 とする
        .Max();                                                         // 最大値を取得する
    var fileName = String.Format("{0}_{1:d3}.txt", tagName, max + 1);
    Console.WriteLine(fileName);
    
[/code]




BLUEPIXYさんの回答では

> 連番の最大値＋１でファイル名を生成したい

に答えられていないので、ちょっと修正します。（tagNameが正規表現に反応する+や[]を含んでいた場合も問題ですし。）

[code]

    var di = new DirectoryInfo(Environment.CurrentDirectory);
    var tagName = "textfile";
    var max = di.GetFiles(tagName + "_???.txt")                         // パターンに一致するファイルを取得する
        .Select(fi => Regex.Match(fi.Name, @"(?i)_(\d{3})\.txt$"))      // ファイルの中で数値のものを探す
        .Where(m => m.Success)                                          // 該当するファイルだけに絞り込む
        .Select(m => Int32.Parse(m.Groups[1].Value))                    // 数値を取得する
        .DefaultIfEmpty(0)                                              // １つも該当しなかった場合は 0 とする
        .Max();                                                         // 最大値を取得する
    var fileName = String.Format("{0}_{1:d3}.txt", tagName, max + 1);
    Console.WriteLine(fileName);
    
[/code]

