2010-05-31 14 views
24

Momentan verwendet meine Anwendung string [] subdirs = Directory.GetDirectories (Pfad), um die Liste der Unterverzeichnisse abzurufen, und jetzt möchte ich den Pfad zu den neuesten extrahieren (zuletzt geändertes) Unterverzeichnis in der Liste.So erhalten Sie das neueste (zuletzt geänderte) Verzeichnis [C#]

Was ist der einfachste Weg, dies zu erreichen? (Effizienz ist kein großes Problem - aber Robustheit ist)

+0

Sollte es rekursiv (alle Nachkommen) sein? –

Antwort

12

ohne Verwendung von LINQ

DateTime lastHigh = new DateTime(1900,1,1); 
string highDir; 
foreach (string subdir in Directory.GetDirectories(path)){ 
    DirectoryInfo fi1 = new DirectoryInfo(subdir); 
    DateTime created = fi1.LastWriteTime; 

    if (created > lastHigh){ 
     highDir = subdir; 
     lastHigh = created; 
    } 
} 
1

Sie Directory.GetLastWriteTime verwenden können (oder Directory.GetLastWriteTimeUtc, sie nicht wirklich in diesem Fall egal, wenn Sie nur relative Vergleiche tun).

Möchten Sie nur die vom Betriebssystem gemeldete "modifizierte" Uhrzeit anzeigen oder möchten Sie das Verzeichnis mit der zuletzt geänderten Datei innerhalb von finden? Sie stimmen nicht immer überein (dh, das Betriebssystem aktualisiert nicht immer die "letzte Änderung" des enthaltenden Verzeichnisses, wenn es eine Datei ändert).

+0

Letzte ORDNER (Dateien Insider sind irrelevant) – Shaitan00

+0

In diesem Fall ist 'Directory.GetLastWriteTime' das, was Sie suchen. Laramies Lösung funktioniert auch, was ungefähr so ​​ist wie ich sagte (er war gerade nett genug, um den Code für dich zu schreiben;) –

37

Nicht-rekursive:

new DirectoryInfo(path).GetDirectories() 
         .OrderByDescending(d=>d.LastWriteTimeUtc).First(); 

Rekursiv:

new DirectoryInfo(path).GetDirectories("*", 
    SearchOption.AllDirectories).OrderByDescending(d=>d.LastWriteTimeUtc).First(); 
0

Wenn Sie einen Windows-Dienst aufbauen und wollen Sie eine neue, wenn benachrichtigt werden Datei oder Verzeichnis wird erstellt, Sie könnten auch eine FileSystemWatcher verwenden. Zugegeben, nicht so einfach, aber interessant zu spielen. :)

+0

-1 Dies funktioniert nur, wenn das Verzeichnis erstellt wird, während die Anwendung läuft, was nicht unbedingt wahr ist basierend auf den Informationen in der Frage zur Verfügung gestellt. –

+2

Das ist genau der Grund, warum ich einen Windows-Dienst angegeben habe, was bedeutet, dass es die ganze Zeit läuft. –

+0

Das stimmt nicht unbedingt. Dienste können gestartet und gestoppt werden oder zeitweise ausgeführt werden (ich würde behaupten, dass dies ein schlechtes Design ist, aber das ist ein separates Problem). Diese Methode würde die Anwendung nicht benachrichtigen, wenn ein Ordner erstellt wurde, bevor die Anwendung * installiert wurde *. –

3

Seien Sie gewarnt: Sie müssen möglicherweise Refresh() auf Ihrem Directory-Info anrufen Objekt die richtigen Informationen zu erhalten:

z.B. in Laramie Antwort würde bearbeiten Sie:

DirectoryInfo fi1 = new DirectoryInfo(subdir); 
fi1.Refresh(); 
DateTime created = fi1.LastWriteTime; 

Ansonsten könnten Sie veraltete Informationen bekommen wie ich es tat:

„Anrufe müssen, bevor Sie versuchen zu aktualisieren gemacht werden, um das Attribut Informationen zu erhalten, oder die Informationen werden veraltet sein. "

http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.refresh(v=vs.71).aspx

Verwandte Themen