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...
}
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);
@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
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?.
Odpowiedzi:
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... }
źródło
Możesz użyć Linq
var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);
źródło
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); });
źródło
Zwraca datę ostatniej modyfikacji i jej wiek.
źródło
@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
źródło
Jeśli wydajność jest problemem, możesz użyć tego polecenia w MS_DOS:
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?.
źródło
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());
źródło