ฉันต้องการค้นหาไฟล์ที่แก้ไขล่าสุดในไดเรกทอรี
ฉันรู้ว่าฉันสามารถวนซ้ำทุกไฟล์ในโฟลเดอร์และเปรียบเทียบFile.GetLastWriteTime
แต่มีวิธีที่ดีกว่าในการทำเช่นนี้โดยไม่ต้องวนซ้ำ?
ฉันต้องการค้นหาไฟล์ที่แก้ไขล่าสุดในไดเรกทอรี
ฉันรู้ว่าฉันสามารถวนซ้ำทุกไฟล์ในโฟลเดอร์และเปรียบเทียบFile.GetLastWriteTime
แต่มีวิธีที่ดีกว่าในการทำเช่นนี้โดยไม่ต้องวนซ้ำ?
คำตอบ:
แล้วอย่างนี้ ...
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()
แทนFirst()
? หลังจะทำให้InvalidOperationException
ถ้าไดเรกทอรีว่างเปล่า
หากคุณต้องการค้นหาซ้ำคุณสามารถใช้รหัสที่สวยงามนี้:
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();
}
เพียงเรียกวิธีดังต่อไปนี้:
FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\"));
และนั่นคือมัน ส่งคืนFileInfo
อินสแตนซ์หรือnull
ถ้าไดเรกทอรีว่างเปล่า
ขยายไปยังรูปแรกด้านบนหากคุณต้องการค้นหารูปแบบที่แน่นอนคุณสามารถใช้รหัสต่อไปนี้:
string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();
รุ่นที่ไม่ใช่ 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;
}
สั้นและง่าย :
new DirectoryInfo(path).GetFiles().OrderByDescending(o => o.LastWriteTime).FirstOrDefault();
มันสายไปหน่อย แต่ ...
รหัสของคุณจะไม่ทำงานเพราะlist<FileInfo> lastUpdateFile = null;
และหลังจากนั้นlastUpdatedFile.Add(file);
ดังนั้นข้อยกเว้น NullReference จะถูกโยนทิ้ง เวอร์ชันการทำงานควรเป็น:
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;
}
ขอบคุณ
อีกวิธีถ้าคุณใช้Directory.EnumerateFiles
และต้องการอ่านไฟล์ที่ถูกแก้ไขล่าสุดโดยอันดับแรก
foreach (string file in Directory.EnumerateFiles(fileDirectory, fileType).OrderByDescending(f => new FileInfo(f).LastWriteTime))
}
นี่คือเวอร์ชันที่รับไฟล์ล่าสุดจากแต่ละไดเรกทอรีย่อย
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;
}
ฉันทำสิ่งนี้เป็นกลุ่มแอพของฉันและฉันใช้คำสั่งเช่นนี้:
var inputDirectory = new DirectoryInfo("\\Directory_Path_here");
var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
จากที่นี่คุณจะมีชื่อไฟล์สำหรับไฟล์ที่บันทึก / เพิ่ม / อัปเดตล่าสุดในไดเรกทอรีของตัวแปร "inputDirectory" ตอนนี้คุณสามารถเข้าถึงได้และทำสิ่งที่คุณต้องการด้วย
หวังว่าจะช่วย