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?
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?
Jawaban:
Bagaimana dengan sesuatu yang seperti ini...
var directory = new DirectoryInfo("C:\\MyDirectory");
var myFile = (from f in directory.GetFiles()
orderby f.LastWriteTime descending
select f).First();
// or...
var myFile = directory.GetFiles()
.OrderByDescending(f => f.LastWriteTime)
.First();
directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First()
FirstOrDefault()
bukan First()
? Yang terakhir akan menyebabkan InvalidOperationException
jika direktori kosong.
Jika Anda ingin mencari secara rekursif, Anda dapat menggunakan kode yang indah ini:
public static FileInfo GetNewestFile(DirectoryInfo directory) {
return directory.GetFiles()
.Union(directory.GetDirectories().Select(d => GetNewestFile(d)))
.OrderByDescending(f => (f == null ? DateTime.MinValue : f.LastWriteTime))
.FirstOrDefault();
}
Sebut saja dengan cara berikut:
FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\"));
dan hanya itu. Mengembalikan FileInfo
contoh atau null
jika direktori kosong.
Memperluas yang pertama di atas, jika Anda ingin mencari pola tertentu Anda dapat menggunakan kode berikut:
string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();
Versi non-LINQ:
/// <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>
private static DateTime GetLatestWriteTimeFromFileInDirectory(DirectoryInfo directoryInfo)
{
if (directoryInfo == null || !directoryInfo.Exists)
return DateTime.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>
private static FileInfo GetLatestWritenFileFileInDirectory(DirectoryInfo directoryInfo)
{
if (directoryInfo == null || !directoryInfo.Exists)
return null;
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;
}
sudah agak terlambat tapi ...
kode Anda tidak akan berfungsi, karena list<FileInfo> lastUpdateFile = null;
dan kemudian lastUpdatedFile.Add(file);
pengecualian NullReference akan dibuang. Versi kerja harus:
private List<FileInfo> GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo)
{
FileInfo[] files = directoryInfo.GetFiles();
List<FileInfo> lastUpdatedFile = new List<FileInfo>();
DateTime lastUpdate = DateTime.MinValue;
foreach (FileInfo file in files)
{
if (file.LastAccessTime > lastUpdate)
{
lastUpdatedFile.Add(file);
lastUpdate = file.LastAccessTime;
}
}
return lastUpdatedFile;
}
Terima kasih
Anda dapat bereaksi terhadap aktivitas file baru dengan FileSystemWatcher .
Berikut adalah versi yang mendapatkan file terbaru dari setiap subdirektori
List<string> reports = new List<string>();
DirectoryInfo directory = new DirectoryInfo(ReportsRoot);
directory.GetFiles("*.xlsx", SearchOption.AllDirectories).GroupBy(fl => fl.DirectoryName)
.ForEach(g => reports.Add(g.OrderByDescending(fi => fi.LastWriteTime).First().FullName));
private List<FileInfo> GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo)
{
FileInfo[] files = directoryInfo.GetFiles();
List<FileInfo> lastUpdatedFile = null;
DateTime lastUpdate = new DateTime(1, 0, 0);
foreach (FileInfo file in files)
{
if (file.LastAccessTime > lastUpdate)
{
lastUpdatedFile.Add(file);
lastUpdate = file.LastAccessTime;
}
}
return lastUpdatedFile;
}
Saya melakukan ini adalah sekelompok aplikasi saya dan saya menggunakan pernyataan seperti ini:
var inputDirectory = new DirectoryInfo("\\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.
Semoga itu bisa membantu.