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

Chr*_*eis 130 .net c# loops file last-modified

我需要在目录中找到最近修改过的文件.

我知道我可以遍历文件夹中的每个文件并进行比较File.GetLastWriteTime,但有没有更好的方法可以在不循环的情况下执行此操作?

Sco*_*vey 294

这样的事情怎么样......

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();
Run Code Online (Sandbox Code Playgroud)

  • 就个人而言,我发现非加糖版本更容易阅读:`directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First()` (81认同)
  • 这不应该使用`FirstOrDefault()`而不是`First()`?如果目录为空,后者将导致`InvalidOperationException`. (8认同)
  • 是的,我同意大多数时间 - 但是在给出示例时,查询语法使得它更加明显,它是一个linq查询.我将使用两个选项更新示例以澄清. (5认同)
  • 谢谢!现在我只需要说服我的老板加快从.net 2.0升级我们的过程,这样我就可以使用Linq了:) (3认同)
  • 您可以使用带有2.0 SP1的linq和一些额外的工作 - 只需从3.5引用System.Core.dll文件,并将其设置为"copy local" (3认同)
  • @ SiKni8,应该也一样.你只需要逃避你的反斜杠.DirectoryInfo(@"\\ myserver\myfolder")或DirectoryInfo("\\\\ myserver \\ myfolder")都应该有效. (3认同)
  • 小心使用LastWriteTime,如果文件从未被修改,该值将返回1600年1月1日.这会弄乱你的整理. (3认同)
  • 很好,下面某个地方一定有一个循环。:) 我想如果你没有看到它,它就不在那里。+1 (2认同)

Edg*_*ado 19

如果你想以递归方式搜索,你可以使用这段漂亮的代码:

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();                        
}
Run Code Online (Sandbox Code Playgroud)

只需按以下方式调用它:

FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\"));
Run Code Online (Sandbox Code Playgroud)

就是这样.返回FileInfo实例或null目录为空.

  • 或者您可以使用[递归搜索](http://msdn.microsoft.com/en-us/library/ms143327(v = vs.110).aspx)选项. (12认同)

小智 17

扩展上面的第一个,如果要搜索某个模式,可以使用以下代码:

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

  • 对于那些可能忘记的人:您必须包含“using System.Linq”,否则会出现错误。 (3认同)

Tim*_*hyP 10

非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;
}
Run Code Online (Sandbox Code Playgroud)

  • 此代码无法编译. - lastUpdatedFile不应该是一个数组. - lastUpdate的初始值无效(0001/0/0). (3认同)

Jac*_*cob 7

简短而简单

new DirectoryInfo(path).GetFiles().OrderByDescending(o => o.LastWriteTime).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)