2010-12-01 8 views
2

Ich habe eine Liste von Dateien, die ich basierend auf dem Datum sortieren möchte. Der Nachteil ist, dass jede Datei in der Liste das Datum als Teil des Dateinamens enthält. Ich möchte die Dateien basierend auf diesem Datum sortieren. Der Grund dafür ist, dass das Datum in der Dateinamenszeichenfolge mit dem Inhalt in der Datei übereinstimmt, dh die tatsächliche Datumseigenschaft jeder Datei, das Erstellungsdatum, die Änderung, der Zugriff usw. können sich ändern, wenn die Datei verschoben wird oder modifiziert und so kann ich mich nicht für meine Zwecke darauf verlassen. Ich erstelle einen benutzerdefinierten Vergleich, um ihn in der Listensortiermethode zu verwenden, aber ich wollte sehen, ob jemand da draußen noch andere bessere oder einzigartige Ansätze hat. Danke im Voraus.Sortieren einer Datei nach dem Inhalt des Dateinamens

UPDATE:

In Antwort auf Saeed Kommentar, folgt der Dateiname dieses Format:

{Test Name}_{YYYYMMDD}_{HHmmSS}.txt 

Wo das YYYYMMDD und HHmmss das Datum und die Uhrzeit sind jeweils.

UPDATE 2:

Ok, habe ich einen Vergleich up geschrieben, dass der Job ganz gut hier zu tun scheint, ist es, wenn es jemand anderes hilft; es würde nicht viel Mühe kosten, es zu ändern, um nach anderen Elementen im Dateinamen zu suchen, muss nur den regulären Ausdruck ändern. Danke allen für die Anregungen, konstruktive Kritik ist immer willkommen.

public class TDRDateTimeComparer : IComparer<FileInfo> 
{ 
    public int Compare(FileInfo x, FileInfo y) 
    { 
     //Return if both strings are null or empty 
     if (string.IsNullOrEmpty(x.Name) && string.IsNullOrEmpty(y.Name)) 
     { 
      return 0; 
     } 
     Regex rDateTime = new Regex(@"(19|20|21)\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])_([0-1]\d|2[0-3])([0-5]\d)([0-5]\d)"); 

     /* NOTE: File names will already have been validated at this point, so no need to validate the date/time again.*/ 
     string date1 = rDateTime.Match(x.Name).Value, date2 = rDateTime.Match(y.Name).Value; 
     DateTime d1 = DateTime.ParseExact(date1, "yyyyMMdd_HHmmss", null), d2 = DateTime.ParseExact(date2, "yyyyMMdd_HHmmss", null); 

     return d1.CompareTo(d2); 
    } 
} 
+0

Was sind Ihre Dateinamen Formate und was Sie getan haben, um es zu verbessern? –

Antwort

2

Ich würde sagen, eine benutzerdefinierte Vergleich ist der Weg zu gehen. Verwenden Sie einfach Regex, um die Datumsteile zu extrahieren, erstellen Sie dann eine DateTime daraus und vergleichen Sie diese.

+0

Hier ist ein Beispiel dafür - http://en.csharp-online.net/Comparer_class – BeemerGuy

1

Sie können die Erweiterungsmethode OrderBy verwenden und den Wert angeben, nach dem sortiert werden soll. Beispiel:

list = list.OrderBy(f => DateTime.Parse(Path.GetFileName(f.Name))).ToList(); 
+2

Angesichts der Bemerkung des OP, dass * "jede Datei in der Liste enthält das Datum ** als Teil ** seiner [sic] -Dateiname "*, du wirst etwas mehr arbeiten müssen als das ... :) –

1

habe ich auf einem System zu arbeiten, die Dateien mit einem Datum & Zeit in den Dateinamen verschlüsselt erzeugt. Das Datumsformat passte in das alte Dateinamenformat von DOS 8.2.

Aufgrund der Namenskonvention, wenn Sie die Dateien im Dateisystem auflisten, wurden sie natürlich korrekt sortiert. Wenn Sie diese Menge an Kontrolle haben, könnten Sie es so machen. das heißt, sie zu benennen JJJJMMTT ... wird standardmäßig nach Datum sortiert.

Kein zusätzlicher Code erforderlich.

+0

Wie bist du sicher, dass sie nach ihrem Namen sortiert sind? Kann nach Typ oder anderen Dingen sortiert werden. –

+0

Da die Windows-API-Verzeichnislistenfunktionen immer nach Namen sortiert sind. – Matt

Verwandte Themen