Pobieranie plików według daty utworzenia w .NET

94

Mam folder zawierający wiele plików. Czy istnieje łatwy sposób na uzyskanie nazw plików w katalogu posortowanych według daty / godziny ich utworzenia?

Jeśli używam Directory.GetFiles(), zwraca pliki posortowane według nazwy pliku.

Rozsądne
źródło
4
Funkcja GetFiles () nie sortuje, więc uporządkowanie ich według nazwy jest przypadkowe. Po prostu uporządkuj siebie.
Hans Passant

Odpowiedzi:

203

to może działać 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...
}
George Taskos
źródło
„System.IO.FileInfo []” nie zawiera definicji „OrderBy”
Umair Jabbar
2
To metoda rozszerzenia ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo
14
Myślę, że nie ma potrzeby wywoływania metody ToArray ().
Ivo
AnyIdeas bez używania metod rozszerzających / LINQ, ponieważ
celuję w
10
Rozważyć użycie info.GetFiles () orderby (p => p.CreationTimeUtc) zamiast CreationTime jeśli jest jakaś szansa pliki w katalogu mogą być tworzone w różnych strefach czasowych (w tym czas letni).
Steve
47

Możesz użyć Linq

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);
Sev
źródło
2
Rozwiązanie DirectoryInfo jest znacznie szybsze niż to (szczególnie w przypadku ścieżki sieciowej)
jing
9

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);
});
Henrik
źródło
4

Zwraca datę ostatniej modyfikacji i jej wiek.

DateTime.Now.Subtract(System.IO.File.GetLastWriteTime(FilePathwithName).Date)
BMG
źródło
1

@jing: „Rozwiązanie DirectoryInfo jest znacznie szybsze niż to (szczególnie w przypadku ścieżki sieciowej)”

Nie mogę tego potwierdzić. Wygląda na to, że Directory.GetFiles wyzwala system plików lub pamięć podręczną sieci. Pierwsze żądanie zajmuje trochę czasu, ale kolejne żądania są znacznie szybsze, nawet jeśli zostały dodane nowe pliki. W moim teście zrobiłem Directory.getfiles i info.GetFiles z tymi samymi wzorcami i oba działają jednakowo

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
Przechodzień
źródło
1

Jeśli wydajność jest problemem, możesz użyć tego polecenia w MS_DOS:

dir /OD >d:\dir.txt

To polecenie generuje plik dir.txt w ** d: ** root, aby wszystkie pliki były posortowane według daty. A następnie przeczytaj plik z kodu. Dodajesz również inne filtry według * i?.

grandhougday
źródło
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
źródło