2017-08-26 2 views
1

Ich möchte Filter, welche Dateien von der Directory.GetFiles() -Funktion zurückgegeben werden. Die Dateien im Verzeichnis sind alle Textdateien, die mit sechsstelligen Zahlen in inkrementeller Reihenfolge benannt sind (zB: "200501.txt", "200502.txt", "200503.txt", usw.), ich möchte a eingeben "Rechnungsnummer starten" und "Rechnungsnummer beenden" über 2 Textfeldsteuerelemente, um nur die Dateien innerhalb dieses Bereichs zurückzugeben.Wie filtere ich Directory.GetFiles() um einen numerischen Bereich, wenn Dateinamen in numerischer Reihenfolge aufgeführt sind?

Der aktuelle Code ist wie folgt ...

 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++; 
        } 
       } 
      } 
     } 

Vielen Dank im Voraus!

Antwort

2

Sie können den integrierten Filter, den die GetFiles-Methode bietet, nicht verwenden, der nur nach Platzhaltern filtern kann. Sie können es mit einigen LINQ tun:

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

Hinweis: C# 7 var verwenden, kann aber zu früheren Versionen umgewandelt werden, wenn Sie die aktuelle nicht verwenden.

+2

Verwenden Sie auch 'EnumerateFiles' anstelle von' GetFiles'. – mjwills

+2

Ja, Sie haben Recht, 'EnumerateFiles' ist besser die Antwort geändert, um dies widerzuspiegeln –

+0

Danke, ich werde dies untersuchen und es jetzt versuchen! – MegaByteMe

Verwandte Themen