2017-03-23 2 views
0

Ich brauche alle Dateien aus einem Verzeichnis zu erhalten, von dem Datum geordnet, die als Teil der Dateien Name vorhanden ist:Get Verzeichnisdateien von einem Datum geordnet, die einen Teil des Dateinamens ist

James_2015.06.27.pdf 
Anna_2017.01.17.pdf 
Timmy_2017.02.19.pdf 

Zurzeit verwende ich diese, die nur die Dateien nach Name sortiert.

DirectoryInfo info = new DirectoryInfo(path); 
FileInfo[] files = info.GetFiles(filter).OrderBy(p => p.Name).ToArray(); 

Irgendwelche Ideen, wie kann ich das erreichen?

Antwort

4

Sie müssen den Dateinamen analysieren:

DirectoryInfo info = new DirectoryInfo(path); 
FileInfo[] files = info.GetFiles(filter) 
    .OrderBy(p => Path.GetFileNameWithoutExtension(p.FullName).Split('_')[1]) 
    .ToArray(); 

Aber das ist fehleranfällig.


Mit Linq

Wie ich schon sagte, ist dieser Fehler anfällig, würde ich wahrscheinlich so etwas schreiben:

DirectoryInfo info = new DirectoryInfo(path); 


FileInfo[] files = (from fileInfo in info.GetFiles(filter) 
        let splitted = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_') 
        where splitted.Length > 1 
        orderby splitted[1] 
        select fileInfo).ToArray(); 

Eine bessere Möglichkeit, die Parsen würde datetime und sortiere darauf.

Dies wird auch auf die Dateien filtern, die kein gültiges Datum innerhalb des Dateinamens hat.

private DateTime? ParseFilename(FileInfo fileInfo) 
{ 
    var parts = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_'); 
    if (parts.Length < 1) 
     return null; 

    DateTime result; 

    if (!DateTime.TryParse(parts[1], out result)) 
     return null; 

    return result; 
} 

Verbrauch:

DirectoryInfo info = new DirectoryInfo(path); 

FileInfo[] files = (from fileInfo in info.GetFiles(filter) 
        let DateTime = ParseFilename(fileInfo) 
        where DateTime.HasValue 
        orderby DateTime.Value 
        select fileInfo).ToArray(); 
+0

Nicht gültiger Code sehr unklar ist: Kann nicht Fileinfo zu String –

+0

konvertieren: 'Pfad .GetFileNameWithoutExtension (p) ' –

+0

@KobyDouek aktualisiert –

0

Ich würde ein Wörterbuch mit dem Dateinamen als Schlüssel erstellen und der Wert wäre eine Teilzeichenfolge aus dem Dateinamen und nur das Datum enthalten.

Sie können Schleife über Ihre DirectoryEntrys und fügen Sie sie in das Wörterbuch in einer Schleife würde der Algorithmus so sein:

     string filename1 = "asbdahszd2018.02.01.pdf"; 
         string filename2 = "foobar2018.02.01.pdf"; 

         Dictionary<string, string> myDict = new Dictionary<string,string>(); 

         myDict.Add(filename1, filename1.Substring(filename1.Length - 14, 10)); 
         myDict.Add(filename2, filename2.Substring(filename2.Length - 14, 10)); 

         myDict.OrderBy(item => item.Value); 
+0

Bitte erläutern Sie, diese –

1

Dies sollte für Sie arbeiten:

DirectoryInfo info = new DirectoryInfo(path); 
FileInfo[] files = info.GetFiles(filter).OrderBy(p => Path.GetFileNameWithoutExtension(p.Name).Split('_').Last()).ToArray(); 
Verwandte Themen