【发布时间】:2011-02-25 20:17:33
【问题描述】:
目前我的应用程序使用 string[] subdirs = Directory.GetDirectories(path) 来获取子目录列表,现在我想提取列表中最新(最后修改)子目录的路径。
完成此任务的最简单方法是什么? (效率不是主要问题 - 但稳健性是)
【问题讨论】:
-
应该是递归的(所有后代)?
目前我的应用程序使用 string[] subdirs = Directory.GetDirectories(path) 来获取子目录列表,现在我想提取列表中最新(最后修改)子目录的路径。
完成此任务的最简单方法是什么? (效率不是主要问题 - 但稳健性是)
【问题讨论】:
非递归:
new DirectoryInfo(path).GetDirectories()
.OrderByDescending(d=>d.LastWriteTimeUtc).First();
递归:
new DirectoryInfo(path).GetDirectories("*",
SearchOption.AllDirectories).OrderByDescending(d=>d.LastWriteTimeUtc).First();
【讨论】:
不使用 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 比明确的时间点更安全。
试试这个:
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
【讨论】:
请注意:您可能需要在 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
【讨论】:
您可以使用Directory.GetLastWriteTime(或Directory.GetLastWriteTimeUtc,在这种情况下,当您只是进行相对比较时,这并不重要)。
虽然您只是想查看操作系统报告的“修改”时间,还是想找到里面最近修改文件的目录?它们并不总是匹配的(也就是说,操作系统在修改文件时并不总是更新包含目录的“最后修改”时间)。
【讨论】:
Directory.GetLastWriteTime 就是您所追求的。 Laramie 的解决方案也有效,正如我所说的那样(他很友善地为您编写代码;)
如果您正在构建 Windows 服务,并且希望在创建新文件或目录时收到通知,您也可以使用 FileSystemWatcher。诚然不是那么容易,但玩起来很有趣。 :)
【讨论】: