4316


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 はファイル名のパターンが違うので無視）

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


CC BY-SA 3.0
2015-01-08T23:36:55.297
4312
2015-01-09T01:34:35.667
3925
question
c#
連番のファイル名を生成するには


以下の様にすればファイルが存在すれば最後のファイル名が得られ  
存在しない場合は指定したファイル名部分_000.txt`が得られるので、  
後はそれをインクリメントすればいいです。

[code]

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;
    
    public class Sample
    {
        public static void Main() 
        {
            DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory);
            string tagName = "textfile";
            string file = di.GetFiles(tagName + "_???.txt")
                .Where(x => Regex.Match(x.Name, tagName + "_\\d{3}").Success)
                .OrderByDescending(x => x.Name)
                .Select(x => x.Name)
                .FirstOrDefault();
            if(file == null)
                file = tagName + "_000.txt";
            Console.WriteLine(file);//最大番号のファイル、存在しない場合は000番
        }
    }
    
[/code]


CC BY-SA 3.0
2015-01-09T00:44:50.997
4313
2015-01-09T00:44:50.997
5044
4312
answer


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]


CC BY-SA 3.0
2015-01-09T01:34:35.667
4316
2015-01-09T01:34:35.667
4236
4312
answer