[英]VB.NET Directory.GetFiles Sort by Date
我有Xml文件的目录。 如何仅捕获最近30天创建的文件并按升序对其进行排序? 如果有更有效的解决方案,我就不必使用Directory.GetFiles。
然后,我创建文件列表并将其绑定到需要文件名和路径的gridView。 我显示文件名,并在RowDataBound事件中使用Path值来构建指向该文件的超链接。
谢谢! \\ m / \\ m /
Dim filePaths() As String = Directory.GetFiles("C:\XmlFiles\")
Dim files As List(Of ListItem) = New List(Of ListItem)
For Each filePath As String In filePaths
files.Add(New ListItem(Path.GetFileName(filePath), filePath))
Next
gv.DataSource = files
gv.DataBind()
您可以使用LINQ:
Dim filePathsSortedByDate = From f In Directory.EnumerateFiles("C:\XmlFiles\")
let fileCreationTime = File.GetCreationTime(f)
Where (Date.Today - fileCreationTime.Date).Days <= 30
Order By fileCreationTime
Select New ListItem(Path.GetFileName(f), f)
Dim files As List(Of ListItem) = filePathsSortedByDate.ToList()
我们可以做的更好。 仅获取名称,然后再按时间排序,就需要将这两个属性分别从硬盘驱动器中取出,这很慢。 通过切换到DirectoryInfo
,我们可以将每个文件减少到磁盘一次:
Dim filesByDate = DirectoryInfo.EnumerateFiles("C:\XmlFiles\").
Where(Function(f) f.CreationTime > DateTime.Today.AddDays(-30)).
OrderBy(Function(f) f.CreationTime).
Select(Function(f) f.Name)
gv.DataSource = filesByDate
gv.DataBind()
并不是说差异可能会提高程序的性能,但是减少磁盘I / O总是很不错的。
这也是它可能是更好的事件中使用的情况下GetX
而不是EnumerateX
。 通常,您希望使用将“枚举”而不是“获取”的任何内容,因为减少了内存使用,并且具有在第一个项目可用时立即开始处理的能力,而不是等到最后一个项目可用时才开始处理。 但是,在这种情况下,您有机会将内存使用量换成磁盘I / O。 我不熟悉这些方法的内部实现,但是GetFileSystemInfos()
可能在一次或几次磁盘访问中就获取所有文件的信息,这将是一个巨大的胜利。 但是,再次……我对这里的细节不熟悉。 您必须自己测试一下,哪种情况更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.