Abrufen von Dateien nach Erstellungsdatum in .NET

92

Ich habe einen Ordner, der viele Dateien enthält. Gibt es eine einfache Möglichkeit, die Dateinamen im Verzeichnis nach Erstellungsdatum / -zeit zu sortieren?

Wenn ich verwende Directory.GetFiles(), werden die Dateien nach ihrem Dateinamen sortiert zurückgegeben.

Sinnvoll
quelle
Ich fand eine ähnliche Frage: stackoverflow.com/questions/52842/sorting-directory-getfiles
Senseful
4
GetFiles () sortiert nicht , es ist ein Unfall, sie nach Namen sortiert zu bekommen. Sortieren Sie sich einfach.
Hans Passant

Antworten:

194

das könnte für dich funktionieren.

using System.Linq;

DirectoryInfo info = new DirectoryInfo("PATH_TO_DIRECTORY_HERE");
FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
foreach (FileInfo file in files)
{
    // DO Something...
}
George Taskos
quelle
'System.IO.FileInfo []' enthält keine Definition für 'OrderBy'
Umair Jabbar
2
Es ist eine Erweiterungsmethode ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo
12
Ich denke, es ist nicht nötig, die ToArray () -Methode aufzurufen.
Ivo
AnyIdeas ohne Verwendung von Erweiterungsmethoden / LINQ, da ich auf .NET 2.0
Pratik
10
Verwenden Sie info.GetFiles (). OrderBy (p => p.CreationTimeUtc) anstelle von CreationTime, wenn die Möglichkeit besteht, dass die Dateien im Verzeichnis in verschiedenen Zeitzonen (einschließlich Sommerzeit) erstellt wurden
Steve,
46

Sie können Linq verwenden

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);
Sev
quelle
2
Die DirectoryInfo-Lösung ist viel schneller als diese (insbesondere für den Netzwerkpfad)
Jing
8

Wenn Sie LINQ nicht verwenden möchten

// Get the files
DirectoryInfo info = new DirectoryInfo("path/to/files"));
FileInfo[] files = info.GetFiles();

// Sort by creation-time descending 
Array.Sort(files, delegate(FileInfo f1, FileInfo f2)
{
    return f2.CreationTime.CompareTo(f1.CreationTime);
});
Henrik
quelle
4

Dies gibt das Datum der letzten Änderung und sein Alter zurück.

DateTime.Now.Subtract(System.IO.File.GetLastWriteTime(FilePathwithName).Date)
BMG
quelle
1

@jing: "Die DirectoryInfo-Lösung ist viel schneller als diese (insbesondere für den Netzwerkpfad)."

Ich kann das nicht bestätigen. Es scheint, als ob Directory.GetFiles ein Dateisystem oder einen Netzwerkcache auslöst. Die erste Anforderung dauert eine Weile, aber die folgenden Anforderungen sind viel schneller, selbst wenn neue Dateien hinzugefügt wurden. In meinem Test habe ich Directory.getfiles und info.GetFiles mit denselben Mustern erstellt und beide werden gleichermaßen ausgeführt

GetFiles  done 437834 in00:00:20.4812480
process files  done 437834 in00:00:00.9300573
GetFiles by Dirinfo(2)  done 437834 in00:00:20.7412646
Passant
quelle
0
            DirectoryInfo dirinfo = new DirectoryInfo(strMainPath);
            String[] exts = new string[] { "*.jpeg", "*.jpg", "*.gif", "*.tiff", "*.bmp","*.png", "*.JPEG", "*.JPG", "*.GIF", "*.TIFF", "*.BMP","*.PNG" };
            ArrayList files = new ArrayList();
            foreach (string ext in exts)
                files.AddRange(dirinfo.GetFiles(ext).OrderBy(x => x.CreationTime).ToArray());
Ata Hoseini
quelle
0

Wenn die Leistung ein Problem darstellt, können Sie diesen Befehl in MS_DOS verwenden:

dir /OD >d:\dir.txt

Dieser Befehl generiert eine dir.txt- Datei in ** d: ** root, in der alle Dateien nach Datum sortiert sind. Und dann lesen Sie die Datei aus Ihrem Code. Außerdem fügen Sie andere Filter nach * und? Hinzu.

Großtag
quelle