Tôi cần tìm tập tin sửa đổi gần đây nhất trong một thư mục.
Tôi biết tôi có thể lặp qua mọi tệp trong một thư mục và so sánh File.GetLastWriteTime
, nhưng có cách nào tốt hơn để làm điều này mà không cần lặp không?.
Tôi cần tìm tập tin sửa đổi gần đây nhất trong một thư mục.
Tôi biết tôi có thể lặp qua mọi tệp trong một thư mục và so sánh File.GetLastWriteTime
, nhưng có cách nào tốt hơn để làm điều này mà không cần lặp không?.
Câu trả lời:
Còn những thứ như thế này thì sao...
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()
thay vì First()
? Cái sau sẽ gây ra InvalidOperationException
nếu thư mục trống.
Nếu bạn muốn tìm kiếm đệ quy, bạn có thể sử dụng đoạn mã đẹp này:
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();
}
Chỉ cần gọi nó theo cách sau:
FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\"));
và đó là nó. Trả về một FileInfo
thể hiện hoặc null
nếu thư mục trống.
Mở rộng ở mẫu đầu tiên ở trên, nếu bạn muốn tìm kiếm một mẫu nhất định, bạn có thể sử dụng mã sau:
string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();
Phiên bản không thuộc 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;
}
muộn một chút nhưng ...
mã của bạn sẽ không hoạt động, vì list<FileInfo> lastUpdateFile = null;
và sau này lastUpdatedFile.Add(file);
vì vậy ngoại lệ NullReference sẽ bị ném. Phiên bản làm việc phải là:
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;
}
Cảm ơn
Bạn có thể phản ứng với hoạt động tệp mới với FileSystemWatcher .
Đây là phiên bản nhận tệp mới nhất từ mỗi thư mục con
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;
}
Tôi làm điều này là một loạt các ứng dụng của tôi và tôi sử dụng một tuyên bố như thế này:
var inputDirectory = new DirectoryInfo("\\Directory_Path_here");
var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
Từ đây, bạn sẽ có tên tệp cho tệp được lưu / thêm / cập nhật gần đây nhất trong Danh mục của biến "inputDirectory". Bây giờ bạn có thể truy cập nó và làm những gì bạn muốn với nó.
Mong rằng sẽ giúp.