Ich muss die zuletzt geänderte Datei in einem Verzeichnis finden.
Ich weiß, dass ich jede Datei in einem Ordner durchlaufen und vergleichen kann File.GetLastWriteTime
, aber gibt es eine bessere Möglichkeit, dies ohne Schleifen zu tun?
Ich muss die zuletzt geänderte Datei in einem Verzeichnis finden.
Ich weiß, dass ich jede Datei in einem Ordner durchlaufen und vergleichen kann File.GetLastWriteTime
, aber gibt es eine bessere Möglichkeit, dies ohne Schleifen zu tun?
Antworten:
wie wäre es mit so etwas ...
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()
stattdessen verwendet werden First()
? Letzteres führt zu einem, InvalidOperationException
wenn das Verzeichnis leer ist.
Wenn Sie rekursiv suchen möchten, können Sie diesen schönen Code verwenden:
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();
}
Nennen Sie es einfach so:
FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\"));
und das ist es. Gibt eine FileInfo
Instanz zurück oder null
wenn das Verzeichnis leer ist.
Wenn Sie das erste Muster oben erweitern möchten, können Sie den folgenden Code verwenden, wenn Sie nach einem bestimmten Muster suchen möchten:
string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();
Eine Nicht-LINQ-Version:
/// <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;
}
Es ist ein bisschen spät, aber ...
Ihr Code funktioniert aufgrund list<FileInfo> lastUpdateFile = null;
und später nicht, lastUpdatedFile.Add(file);
sodass eine NullReference-Ausnahme ausgelöst wird. Arbeitsversion sollte sein:
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;
}
Vielen Dank
Sie können mit FileSystemWatcher auf neue Dateiaktivitäten reagieren .
Hier ist eine Version, die die neueste Datei aus jedem Unterverzeichnis abruft
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;
}
Ich mache das ist eine Reihe meiner Apps und ich benutze eine Aussage wie diese:
var inputDirectory = new DirectoryInfo("\\Directory_Path_here");
var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
Von hier aus haben Sie den Dateinamen für die zuletzt gespeicherte / hinzugefügte / aktualisierte Datei im Verzeichnis der Variablen "inputDirectory". Jetzt können Sie darauf zugreifen und damit machen, was Sie wollen.
Hoffentlich hilft das.