2017-08-26 8 views
1

Directory.GetFiles()関数から返されるファイルをフィルタしたい。ディレクトリ内のファイルはすべて、6桁の数字の付いたすべてのテキストファイルです(例: "200501.txt"、 "200502.txt"、 "200503.txt"など)。 "Invoice Number"と "Ending Invoice Number"の2つのテキストボックスコントロールを使用して、その範囲内のファイルのみを返すことができます。次のようにファイル名が数字順にリストされている場合、Directory.GetFiles()を数値範囲でフィルタリングするにはどうすればよいですか?

現在のコードがある...

 using (var fbd = new FolderBrowserDialog()) 
     { 
      DialogResult result = fbd.ShowDialog(); 

      if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath)) 
      { 
       string[] fileDir = Directory.GetFiles(fbd.SelectedPath); 
       string[] files = fileDir; 

       foreach (string loopfile in files) 
       { 
        int counter = 0; 
        string line; 
        //Gets invoice number from text file name 
        //This strips all unnecessary strings out of the directory and file name 
        //need to change substring 32 to depending directory using 
        string loopfileName = loopfile.Substring(32); 
        string InvoiceNumberLong = Path.GetFileName(loopfile); 
        string InvoiceNumber = InvoiceNumberLong.Substring(0,(InvoiceNumberLong.Length - 4)).ToString(); 
        var controlCount = new List<string>(); 
        var EndCount = new List<string>(); 

        //Read through text file line by line to find all instances of "control" and "------" string 
        //adds all line position of these strings to lists 
        System.IO.StreamReader file = new System.IO.StreamReader(loopfile); 
        while ((line = file.ReadLine()) != null) 
        { 
         if (line.Contains("Control")) 
         { 
          controlCount.Add(counter.ToString()); 
         } 
         if (line.Contains("------")) 
         { 
          EndCount.Add(counter.ToString()); 
         } 
         counter++; 
        } 
       } 
      } 
     } 

は、事前にありがとうございます!

答えて

2

GetFilesメソッドが提供する、ワイルドカードのみでフィルタリングできる組み込みフィルタは使用できません。

var files = Directory.EnumerateFiles(path, "*.txt") 
     .Where(d => int.TryParse(Path.GetFileNameWithoutExtension(d), out var value) && value > min && value < max); 

注:あなたは、いくつかのLINQでそれを行うことができますVARからC#7を使用していますが、最新のを使用していない場合は、以前のバージョンに変換することができます。

+2

また、 'GetFiles'ではなく' EnumerateFiles'を使うことを検討してください。 – mjwills

+2

はい、あなたは正しいです、EnumerateFilesはこれを反映するために答えをより良く変更しました –

+0

ありがとう私はこれを調べ、今試してみましょう! – MegaByteMe

関連する問題