Bir dizinde en son değiştirilen dosyayı bulmam gerekiyor.
Bir klasördeki her dosya üzerinden döngü ve karşılaştırma biliyorum File.GetLastWriteTime
, ama döngü olmadan bunu yapmak için daha iyi bir yolu var mı ?.
Bir dizinde en son değiştirilen dosyayı bulmam gerekiyor.
Bir klasördeki her dosya üzerinden döngü ve karşılaştırma biliyorum File.GetLastWriteTime
, ama döngü olmadan bunu yapmak için daha iyi bir yolu var mı ?.
Yanıtlar:
böyle bir şeye ne dersin ...
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()
yerine kullanmamalı First()
mı? İkincisi InvalidOperationException
, dizin boşsa bir neden olur .
Yinelemeli olarak arama yapmak istiyorsanız, bu güzel kod parçasını kullanabilirsiniz:
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();
}
Sadece şu şekilde arayın:
FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\"));
ve bu kadar. Bir FileInfo
örnek döndürür veya null
dizin boşsa.
Yukarıdaki ilkine genişleyerek, belirli bir deseni aramak istiyorsanız aşağıdaki kodu kullanabilirsiniz:
string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();
LINQ olmayan bir sürüm:
/// <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;
}
biraz geç ama ...
kodunuz çalışmaz, çünkü list<FileInfo> lastUpdateFile = null;
daha sonra lastUpdatedFile.Add(file);
NullReference istisnası atılır. Çalışma sürümü şöyle olmalıdır:
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;
}
Teşekkürler
FileSystemWatcher ile yeni dosya etkinliğine tepki verebilirsiniz .
Her alt dizinden en son dosyayı alan bir sürüm
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;
}
Bu benim uygulamalar bir grup yapmak ve böyle bir ifade kullanın:
var inputDirectory = new DirectoryInfo("\\Directory_Path_here");
var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
Buradan, "inputDirectory" değişkeninin Dizininde en son kaydedilen / eklenen / güncellenen dosya için dosya adına sahip olacaksınız. Artık ona erişebilir ve istediğinizi yapabilirsiniz.
Umarım yardımcı olur.