2011-01-22 11 views
65

Mam folder zawierający wiele plików. Czy istnieje łatwy sposób na uzyskanie nazw plików w katalogu posortowanym według daty/czasu utworzenia?Pobieranie plików według dat utworzenia w .NET

Jeśli użyję Directory.GetFiles(), to zwróci pliki posortowane według nazwy pliku.

+0

Znalazłem podobne pytanie: http://stackoverflow.com/questions/52842/sorting-directory -getfiles – Senseful

+4

GetFiles() nie * nie * sortuje, a ich pobranie według nazwy jest przypadkowe. Po prostu się posortuj. –

Odpowiedz

138

to może pracować dla Ciebie.

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

'System.IO.FileInfo []' nie zawiera definicji "OrderBy" –

+2

Jest to metoda rozszerzenia ... http://msdn.microsoft. com/en-us/library/bb383977.aspx – ivowiblo

+9

Myślę, że nie ma potrzeby wywoływania metody ToArray(). – ivowiblo

34

Można używać LINQ

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime); 
+0

Rozwiązanie DirectoryInfo jest znacznie szybsze niż to (szczególnie w przypadku ścieżki sieciowej). – jing

4

Powoduje wyświetlenie daty ostatniej modyfikacji i jej wieku.

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

Jeśli nie chcesz używać LINQ

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

@jing: "Rozwiązanie DirectoryInfo jest znacznie szybciej niż to (szczególnie dla ścieżki sieciowej)"

ja mogę to potwierdzić . Wygląda na to, że Directory.GetFiles uruchamia system plików lub pamięć podręczną sieci. Pierwsze żądanie trwa chwilę, ale poniższe żądania są znacznie szybsze, nawet jeśli zostały dodane nowe pliki. W moim teście Zrobiłem Directory.GetFiles a info.GetFiles z tych samych wzorów i oba uruchomić równie

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 
Powiązane problemy