2010-05-31 92 views
24

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

完成此操作的最简单方法是什么? (效率不是主要问题 - 但鲁棒性是)

+0

它应该是递归(所有后代)? – 2010-05-31 04:13:52

回答

12

不使用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; 
    } 
} 
1

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

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

+0

最近的文件夹(文件内幕无关紧要) – Shaitan00 2010-05-31 04:11:37

+0

在这种情况下,'Directory.GetLastWriteTime'就是你所追求的。 Laramie的解决方案也行得通,正如我刚刚所说的那样(他只是非常友好地为您编写代码;) – 2010-05-31 04:30:54

37

非递归:

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

递归:

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

如果你正在建设一个窗口服务,你想,当一个新的通知文件或目录已创建,您也可以使用FileSystemWatcher。诚然,并不容易,但玩起来很有趣。 :)

+0

-1这只适用于在应用程序运行时创建目录,但这不一定是真实的根据问题中提供的信息。 – 2010-05-31 04:17:21

+2

这正是我指定Windows服务的原因,意味着它将一直在运行。 – 2010-05-31 04:20:11

+0

这不一定是真的。可以启动和停止服务,或间歇性运行(我认为这是一个糟糕的设计,但这是一个单独的问题)。例如,如果在安装应用程序之前创建文件夹,则此方法不会通知应用程序。 – 2010-05-31 04:23:55

3

被警告:您可能需要调用Refresh()您的目录信息对象,以获得正确的信息:

例如在拉勒米的回答你编辑到:

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

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

“呼吁必须进行刷新尝试获取属性 信息之前,或信息会过时。“

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

相关问题