C# 如何使用.NET查找目录中最近的文件,而不进行循环?

C# 如何使用.NET查找目录中最近的文件,而不进行循环?,c#,.net,file,loops,last-modified,C#,.net,File,Loops,Last Modified,我需要在目录中查找最近修改的文件 我知道我可以循环浏览文件夹中的每个文件,并比较file.GetLastWriteTime,但有没有更好的方法不循环执行此操作?您可以对新的文件活动做出反应。类似这样的事情怎么样 var directory = new DirectoryInfo("C:\\MyDirectory"); var myFile = (from f in directory.GetFiles() orderby f.LastWriteTime descendi

我需要在目录中查找最近修改的文件


我知道我可以循环浏览文件夹中的每个文件,并比较
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();
非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;
}
//
///返回指定目录中的最新写入文件。
///如果目录不存在或不包含任何文件,则返回DateTime.MinValue。
/// 
///需要扫描的目录的路径
/// 
私有静态日期时间GetLatestWriteTimeFromFileInDirectory(DirectoryInfo DirectoryInfo)
{
如果(directoryInfo==null | |!directoryInfo.Exists)
return DateTime.MinValue;
FileInfo[]files=directoryInfo.GetFiles();
DateTime lastWrite=DateTime.MinValue;
foreach(文件中的文件信息文件)
{
如果(file.LastWriteTime>lastWrite)
{
lastWrite=file.LastWriteTime;
}
}
返回上次写入;
}
/// 
///从指定目录返回文件的最新写入时间戳。
///如果目录不存在或不包含任何文件,则返回null。
/// 
///需要扫描的目录的路径
/// 
私有静态文件信息GetLatestWriteFileFileIndirectory(目录信息目录信息)
{
如果(directoryInfo==null | |!directoryInfo.Exists)
返回null;
FileInfo[]files=directoryInfo.GetFiles();
DateTime lastWrite=DateTime.MinValue;
FileInfo lastWritenFile=null;
foreach(文件中的文件信息文件)
{
如果(file.LastWriteTime>lastWrite)
{
lastWrite=file.LastWriteTime;
lastWritenFile=文件;
}
}
返回LastWriteFile;
}

如果要递归搜索,可以使用以下漂亮的代码:

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

私有列表GetLastUpdatedFileInDirectory(DirectoryInfo DirectoryInfo)
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;
}
{ FileInfo[]files=directoryInfo.GetFiles(); List lastUpdatedFile=null; DateTime lastUpdate=新的日期时间(1,0,0); foreach(文件中的文件信息文件) { 如果(file.LastAccessTime>lastUpdate) { lastUpdatedFile.Add(文件); lastUpdate=file.LastAccessTime; } } 返回lastUpdatedFile; }
展开上面第一个,如果要搜索特定图案,可以使用以下代码:

string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();

下面是一个从每个子目录获取最新文件的版本

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));
List reports=newlist();
DirectoryInfo directory=newdirectoryinfo(ReportsRoot);
directory.GetFiles(“*.xlsx”,SearchOption.AllDirectories).GroupBy(fl=>fl.DirectoryName)
.ForEach(g=>reports.Add(g.OrderByDescending(fi=>fi.LastWriteTime.First().FullName));
有点晚了,但是

您的代码将无法工作,因为
list lastUpdateFile=null
以及以后的
lastUpdatedFile.Add(文件)因此将引发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;
}
私有列表GetLastUpdatedFileInDirectory(目录信息目录信息) { FileInfo[]files=directoryInfo.GetFiles(); List lastUpdatedFile=新列表(); DateTime lastUpdate=DateTime.MinValue; foreach(文件中的文件信息文件) { 如果(file.LastAccessTime>lastUpdate) { lastUpdatedFile.Add(文件); lastUpdate=file.LastAccessTime; } } 返回lastUpdatedFile; }

谢谢

我这么做这是我的一堆应用程序,我用了这样一句话:

  var inputDirectory = new DirectoryInfo("\\Directory_Path_here");
  var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
从这里,您将在“inputDirectory”变量的目录中获得最近保存/添加/更新的文件的文件名。现在,您可以访问它并使用它执行您想要的操作


希望对你有所帮助。

简单明了

new DirectoryInfo(path).GetFiles().OrderByDescending(o => o.LastWriteTime).FirstOrDefault();

如果您使用的是
目录.EnumerateFiles
,并且希望读取由first修改的最新文件,则可以使用另一种方法

foreach (string file in Directory.EnumerateFiles(fileDirectory, fileType).OrderByDescending(f => new FileInfo(f).LastWriteTime))

}

它不起作用,因为在应用程序未运行时可以修改文件。他没有给出此类详细信息。。。我们怎么知道它不是一个持久化应用程序呢?我们不知道,但Scott有一个更好的解决方案,在这两种情况下都可以使用。另外,请注意,FSW不能用于大多数网络共享文件夹。就我个人而言,我发现非糖化版本更容易阅读:
directory.GetFiles().OrderByDescending(f=>f.LastWriteTime)。First()
yeah,我大多数时候也同意这种说法,但在给出示例时,查询语法会让我们更清楚地看到它是一个linq查询。我将用这两个选项更新示例以澄清问题。谢谢!现在我只需要说服我的老板加快从.net 2.0升级我们的过程,这样我就可以使用Linq:)你可以在2.0 SP1中使用Linq,只需做一些额外的工作-只需引用3.5中的System.Core.dll文件,并将其设置为“copy local”,这不应该使用
FirstOrDefault()
而不是
First()
?如果目录为空,后者将导致
InvalidOperationException
。抱歉,没有看到您不想循环的事实。无论如何也许它会帮助人们搜索类似的东西,但这段代码并没有编译。-lastUpdatedFile不应是数组。-lastUpdate的初始值无效(0001/0/0)。没有更好的方法可以避免循环。即使使用LINQ,也只是将循环隐藏到一些您无法直接看到的更深层次的功能中。如果您想在整个文件系统中查找最近修改的文件,那么NTFS更改日志将非常有用。但是,从C#中使用非常困难。或者您可以使用该选项。若要添加此选项,如果您的目标是返回文件路径,并且您使用FirstOrDefault,因为可能没有结果,则可以使用null条件