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.



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

„System.IO.FileInfo []” nie zawiera definicji „OrderBy”
Umair Jabbar

2

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

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

4

Zwraca datę ostatniej modyfikacji i jej wiek.

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

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

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


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());
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.