Mendapatkan file berdasarkan tanggal pembuatan di .NET

94

Saya memiliki folder yang berisi banyak file. Apakah ada cara mudah untuk mendapatkan nama file di direktori yang diurutkan berdasarkan tanggal / waktu pembuatannya?

Jika saya menggunakan Directory.GetFiles(), ini mengembalikan file yang diurutkan berdasarkan nama file mereka.

Senseful
sumber
Saya menemukan pertanyaan serupa: stackoverflow.com/questions/52842/sorting-directory-getfiles
Senseful
4
GetFiles () tidak mengurutkan, membuatnya diurutkan berdasarkan nama adalah sebuah kecelakaan. Urutkan saja sendiri.
Hans Passant

Jawaban:

203

ini bisa berhasil untuk Anda.

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
sumber
'System.IO.FileInfo []' tidak berisi definisi untuk 'OrderBy'
Umair Jabbar
2
Ini adalah metode ekstensi ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo
14
Saya pikir tidak perlu memanggil metode ToArray ().
Ivo
AnyIdeas tanpa menggunakan metode ekstensi / LINQ karena saya menargetkan .NET 2.0
Pratik
10
Pertimbangkan untuk menggunakan info.GetFiles (). OrderBy (p => p.CreationTimeUtc) daripada CreationTime jika ada kemungkinan file dalam direktori mungkin telah dibuat di zona waktu yang berbeda (termasuk waktu musim panas)
Steve
46

Anda bisa menggunakan Linq

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);
Sev
sumber
2
Solusi DirectoryInfo jauh lebih cepat daripada ini (terutama untuk jalur jaringan)
jing
9

Jika Anda tidak ingin menggunakan 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
sumber
4

Ini mengembalikan tanggal terakhir diubah dan usianya.

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

@jing: "Solusi DirectoryInfo jauh lebih cepat daripada ini (terutama untuk jalur jaringan)"

Saya tidak bisa memastikan ini. Sepertinya Directory.GetFiles memicu sistem file atau cache jaringan. Permintaan pertama membutuhkan waktu beberapa saat, tetapi permintaan berikut jauh lebih cepat, bahkan jika file baru ditambahkan. Dalam pengujian saya, saya melakukan Directory.getfiles dan info.GetFiles dengan pola yang sama dan keduanya berjalan sama

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
Pelempar
sumber
1

Jika kinerja menjadi masalah, Anda dapat menggunakan perintah ini di MS_DOS:

dir /OD >d:\dir.txt

Perintah ini menghasilkan file dir.txt di ** d: ** root yang memiliki semua file diurutkan berdasarkan tanggal. Dan kemudian baca file dari kode Anda. Selain itu, Anda menambahkan filter lain dengan * dan?.

grandhougday
sumber
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
sumber