Bagaimana menemukan file terbaru di direktori menggunakan .NET, dan tanpa perulangan?
142
Saya perlu mencari file yang paling baru dimodifikasi dalam direktori.
Saya tahu saya dapat mengulangi setiap file dalam folder dan membandingkan File.GetLastWriteTime, tetapi apakah ada cara yang lebih baik untuk melakukan ini tanpa mengulang?
Tidak, tidak ada cara yang lebih baik untuk menghindari perulangan. Bahkan menggunakan LINQ hanya menyembunyikan perulangan ke beberapa fungsi yang lebih dalam di mana Anda tidak dapat melihatnya secara langsung.
Oliver
1
Jika Anda ingin menemukan file yang paling baru dimodifikasi pada seluruh sistem file, maka Jurnal Perubahan NTFS akan berguna. Sangat sangat sulit digunakan dari C #.
Ben Voigt
Jawaban:
318
Bagaimana dengan sesuatu yang seperti ini...
var directory =newDirectoryInfo("C:\\MyDirectory");var myFile =(from f in directory.GetFiles()orderby f.LastWriteTimedescendingselect f).First();// or...var myFile = directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
Secara pribadi, saya menemukan bahwa versi non-gula lebih mudah dibaca:directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First()
Jørn Schou-Rode
6
ya, saya setuju sebagian besar waktu juga - tetapi ketika memberikan contoh sintaks kueri membuatnya sedikit lebih jelas bahwa itu adalah permintaan linq. Saya akan memperbarui contoh dengan kedua opsi untuk memperjelas.
Scott Ivey
3
Terima kasih! Sekarang aku hanya perlu meyakinkan bos saya untuk mempercepat proses upgrade kita dari Net 2.0 sehingga saya dapat menggunakan Linq :)
Chris Klepeis
3
Anda dapat menggunakan LINQ dengan 2.0 SP1 dengan kerja ekstra - hanya referensi file System.Core.dll dari 3,5, dan set ke "copy lokal"
Scott Ivey
8
Tidak harus menggunakan ini FirstOrDefault()bukan First()? Yang terakhir akan menyebabkan InvalidOperationExceptionjika direktori kosong.
Tobias J
20
Jika Anda ingin mencari secara rekursif, Anda dapat menggunakan kode yang indah ini:
/// <summary>/// Returns latest writen file from the specified directory./// If the directory does not exist or doesn't contain any file, DateTime.MinValue is returned./// </summary>/// <param name="directoryInfo">Path of the directory that needs to be scanned</param>/// <returns></returns>privatestaticDateTimeGetLatestWriteTimeFromFileInDirectory(DirectoryInfo directoryInfo){if(directoryInfo ==null||!directoryInfo.Exists)returnDateTime.MinValue;FileInfo[] files = directoryInfo.GetFiles();DateTime lastWrite =DateTime.MinValue;foreach(FileInfo file in files){if(file.LastWriteTime> lastWrite){
lastWrite = file.LastWriteTime;}}return lastWrite;}/// <summary>/// Returns file's latest writen timestamp from the specified directory./// If the directory does not exist or doesn't contain any file, null is returned./// </summary>/// <param name="directoryInfo">Path of the directory that needs to be scanned</param>/// <returns></returns>privatestaticFileInfoGetLatestWritenFileFileInDirectory(DirectoryInfo directoryInfo){if(directoryInfo ==null||!directoryInfo.Exists)returnnull;FileInfo[] files = directoryInfo.GetFiles();DateTime lastWrite =DateTime.MinValue;FileInfo lastWritenFile =null;foreach(FileInfo file in files){if(file.LastWriteTime> lastWrite){
lastWrite = file.LastWriteTime;
lastWritenFile = file;}}return lastWritenFile;}
kode Anda tidak akan berfungsi, karena list<FileInfo> lastUpdateFile = null;
dan kemudian lastUpdatedFile.Add(file);pengecualian NullReference akan dibuang. Versi kerja harus:
Saya melakukan ini adalah sekelompok aplikasi saya dan saya menggunakan pernyataan seperti ini:
var inputDirectory =newDirectoryInfo("\\Directory_Path_here");var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
Dari sini Anda akan memiliki nama file untuk file yang paling baru disimpan / ditambahkan / diperbarui di Direktori variabel "inputDirectory". Sekarang Anda dapat mengaksesnya dan melakukan apa yang Anda inginkan dengannya.
Untuk menambahkan ini, jika tujuan Anda adalah untuk mendapatkan kembali jalur file, dan Anda menggunakan FirstOrDefault karena ada kemungkinan bahwa tidak ada hasil, Anda dapat menggunakan operator kondisional nol pada properti FullName. Ini akan mengembalikan Anda kembali "null" untuk jalur Anda tanpa harus menyimpan FileInfo dari FirstOrDefault sebelum Anda memanggil FullName. string path = new DirectoryInfo (path) .GetFiles (). OrderByDescending (o => o.LastWriteTime) .FirstOrDefault () ?. FullName;
Jawaban:
Bagaimana dengan sesuatu yang seperti ini...
sumber
directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First()
FirstOrDefault()
bukanFirst()
? Yang terakhir akan menyebabkanInvalidOperationException
jika direktori kosong.Jika Anda ingin mencari secara rekursif, Anda dapat menggunakan kode yang indah ini:
Sebut saja dengan cara berikut:
dan hanya itu. Mengembalikan
FileInfo
contoh ataunull
jika direktori kosong.sumber
Memperluas yang pertama di atas, jika Anda ingin mencari pola tertentu Anda dapat menggunakan kode berikut:
sumber
Versi non-LINQ:
sumber
Pendek dan sederhana :
sumber
sudah agak terlambat tapi ...
kode Anda tidak akan berfungsi, karena
list<FileInfo> lastUpdateFile = null;
dan kemudianlastUpdatedFile.Add(file);
pengecualian NullReference akan dibuang. Versi kerja harus:Terima kasih
sumber
Anda dapat bereaksi terhadap aktivitas file baru dengan FileSystemWatcher .
sumber
Pendekatan lain jika Anda menggunakan
Directory.EnumerateFiles
dan ingin membaca file yang termodifikasi terlebih dahulu.sumber
Berikut adalah versi yang mendapatkan file terbaru dari setiap subdirektori
sumber
sumber
Saya melakukan ini adalah sekelompok aplikasi saya dan saya menggunakan pernyataan seperti ini:
Dari sini Anda akan memiliki nama file untuk file yang paling baru disimpan / ditambahkan / diperbarui di Direktori variabel "inputDirectory". Sekarang Anda dapat mengaksesnya dan melakukan apa yang Anda inginkan dengannya.
Semoga itu bisa membantu.
sumber