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.



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...
}

'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);

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

4

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

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

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

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());

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.