【问题标题】:How to get the newest (last modified) directory [C#]如何获取最新(最后修改)的目录 [C#]
【发布时间】:2011-02-25 20:17:33
【问题描述】:

目前我的应用程序使用 string[] subdirs = Directory.GetDirectories(path) 来获取子目录列表,现在我想提取列表中最新(最后修改)子目录的路径。

完成此任务的最简单方法是什么? (效率不是主要问题 - 但稳健性是)

【问题讨论】:

  • 应该是递归的(所有后代)?

标签: c# directory


【解决方案1】:

非递归:

new DirectoryInfo(path).GetDirectories()
                       .OrderByDescending(d=>d.LastWriteTimeUtc).First();

递归:

new DirectoryInfo(path).GetDirectories("*", 
    SearchOption.AllDirectories).OrderByDescending(d=>d.LastWriteTimeUtc).First();

【讨论】:

    【解决方案2】:

    不使用 LINQ

    DateTime lastHigh = new DateTime(1900,1,1);
    string highDir;
    foreach (string subdir in Directory.GetDirectories(path)){
        DirectoryInfo fi1 = new DirectoryInfo(subdir);
        DateTime created = fi1.LastWriteTime;
    
        if (created > lastHigh){
            highDir = subdir;
            lastHigh = created;
        }
    }
    

    【讨论】:

    • 使用DateTime lastHigh = DateTime.MinValue 比明确的时间点更安全。
    【解决方案3】:

    试试这个:

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

    http://zamirsblog.blogspot.com/2012/07/c-find-most-recent-file-in-directory.html

    【讨论】:

      【解决方案4】:

      请注意:您可能需要在 Directory Info 对象上调用 Refresh() 以获取正确信息:

      例如在 Laramie 的回答中,您将编辑为:

      DirectoryInfo fi1 = new DirectoryInfo(subdir);
      fi1.Refresh();
      DateTime created = fi1.LastWriteTime;
      

      否则你可能会像我一样得到过时的信息:

      "在尝试获取属性之前必须调用 Refresh 信息,否则信息将过时。”

      http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.refresh(v=vs.71).aspx

      【讨论】:

        【解决方案5】:

        您可以使用Directory.GetLastWriteTime(或Directory.GetLastWriteTimeUtc,在这种情况下,当您只是进行相对比较时,这并不重要)。

        虽然您只是想查看操作系统报告的“修改”时间,还是想找到里面最近修改文件的目录?它们并不总是匹配的(也就是说,操作系统在修改文件时并不总是更新包含目录的“最后修改”时间)。

        【讨论】:

        • 最近的文件夹(内部文件无关)
        • 在这种情况下,Directory.GetLastWriteTime 就是您所追求的。 Laramie 的解决方案也有效,正如我所说的那样(他很友善地为您编写代码;)
        【解决方案6】:

        如果您正在构建 Windows 服务,并且希望在创建新文件或目录时收到通知,您也可以使用 FileSystemWatcher。诚然不是那么容易,但玩起来很有趣。 :)

        【讨论】:

        • -1 这仅适用于在应用程序运行时创建目录的情况,根据问题中提供的信息,这不一定是正确的。
        • 这正是我指定 Windows 服务的原因,暗示它会一直运行。
        • 这不一定是真的。服务可以启动和停止,或者间歇性运行(我认为这是一个糟糕的设计,但这是一个单独的问题)。例如,如果在安装应用程序之前创建了文件夹,则此方法不会通知应用程序。
        猜你喜欢
        • 1970-01-01
        • 2018-04-04
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多