2016-07-01 8 views
2

Ich habe eine C# -Konsolen-App, die alle Dateien in einem Verzeichnis abruft. Unter den Dateinamen unten als Beispiel, und da ich 3 Saiten haben, ref, year1, year2, wie könnte ich sagen:Dateien aus dem Verzeichnis basierend auf Teilzeichenfolge des Dateinamens abrufen - C#

Dateiname: 31596_2015-06-30.pdf

alle Dateien Geben Sie mir, wo die Dateinamen enthalten ref UND Dateiname enthält ein Jahr zwischen Jahr1 und Jahr 2? -Code so weit:

var files = Directory.EnumerateFiles(sourceDir, "*", SearchOption.TopDirectoryOnly) 
          .Select(Path.GetFileName); 

string start_year = null; 
string end_year = null; 
string ref = null; 

// dr is a sql data reader 
if (dr.HasRows == true) 
{ 
    while (dr.Read()) 
    { 
     start_year = dr.GetString(1).Substring(7, 4); 
     end_year = dr.GetString(2).Substring(7, 4); 
     ref = dr.GetString(3); 

     foreach(string filename in files) 
     { 
      if (filename.Contains(ref)) 
      { 
       File.Copy(sourceDir + filename, targetDir + filename); 
      } 
     } 

     File.Copy(sourceDir + dr.GetString(0), targetDir + dr.GetString(0)); 
    } 
} 
+0

reserviert Siehe bearbeiten, dr ist ein Datenreader – DarkW1nter

+3

ref ist ein Schlüsselwort, so würde ich sehr empfehlen, einen besseren Namen für diese Variable zu finden – Sorceri

Antwort

3

Ich schlage vor, eine Klasse zu extrahieren, sagen wir, FileData:

public class FileData { 
    public bool IsParsed {get; private set; } 

    public String FileName {get; private set; } 

    public DateTime Date {get; private set; } 

    public String Ref {get; private set; } 

    public FileData(String path) { 
    FileName = path; 

    if (String.IsNullOrEmpty(path)) 
     return; 

    int p = path.IndexOf('_'); 

    if (p < 0) 
     return; 

    Ref = path.Substring(0, p); 

    DateTime dt; 

    IsParsed = DateTime.TryParseExact(path.Substring(p + 1), 
     "yyyy-MM-dd", 
     CultureInfo.InvariantCulture, 
     DateTimeStyles.None, 
    out dt); 

    Date = dt; 
    } 
} 

Auf diese Weise können Sie eine einfache Linq setzen um die Dateien zu erhalten

var files = Directory 
    .EnumerateFiles(sourceDir, "*", SearchOption.TopDirectoryOnly) 
    .Select(file => new FileData(file)) 
    .Where(info => info.IsParsed) 
    .Where(info => String.Equals(info.Ref, myRef)) 
    .Where(info => info.Date.Year >= year1 && info.Date.Year <= year2) 
    .Select(info => info.FileName); 
1

Ich mag Linq für diese Art der Sache. Wenn Sie nicht genau wissen, dass die Werte im Reader immer mit dem übereinstimmen, was Sie erwarten, sollten Sie einige Validierungen durchführen, aber dies wird Ihr erklärtes Ziel mit den geringsten Änderungen an Ihrem Beispielcode erreichen.

var start_year = (DateTime)dr.GetString(1).Substring(7, 4); 
    var end_year = (DateTime)dr.GetString(2).Substring(7, 4); 
    ref = dr.GetString(3); 

    foreach(string filename in files.Where(x => x.StartsWith(ref) 
        && (DateTime)x.Substring(7, 4) >= start_year 
        && (DateTime)x.Substring(7, 4) <= end_year)) 
    { 
     File.Copy(sourceDir + filename, targetDir + filename); 
    } 
2

Unter der Annahme, dass Ihre Dateinamen haben immer das Format wie in Ihrem Post, Sie fi Zuerst müssen wir das Jahr aus dem Namen herauslösen. Eine mögliche Lösung könnte sein:

string filenameYear = filename.Split('_')[1].Split('-')[0]; 

dann können Sie diese Zeichenfolge in Ihrem wenn Bedingung verwenden für alle drei Fälle zu fragen:

if (filename.Contains(_ref) && 
    Convert.ToInt32(filenameYear) > Convert.ToInt32(start_year) && 
    Convert.ToInt32(filenameYear) < Convert.ToInt32(end_year)) 
{ 
    // Do what ever you desire 

} 

in der Zeile:

File.Copy(sourceDir + filename, targetDir + filename); 

Wenn sourceDir und targetDir hat am Anfang keine \ oder am Anfang filename. Dies wird zum Absturz bringen. Sie können

File.Copy(Path.Combine(sourceDir,filename), Path.combine(targetDir, filename); 

verwenden, um Probleme

ps zu vermeiden. Sie sollten vermeiden, ref als Name für Variablen in C# zu verwenden. Es ist als keyword

Verwandte Themen