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.



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

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

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

4

Ini mengembalikan tanggal terakhir diubah dan usianya.

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

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

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


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());
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.