VB.NET Directory.GetFiles按日期排序

时间:2017-08-31 12:57:59

标签: asp.net vb.net

我有一个Xml文件目录。如何仅抓取过去30天内创建的文件并按升序对其进行排序?如果有更有效的解决方案,我不一定会使用Directory.GetFiles。

然后我创建文件列表并将其绑定到gridView,其中我需要文件名和路径。我显示文件名并使用RowDataBound事件中的Path值为文件构建HyperLink。

谢谢! \ 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()

2 个答案:

答案 0 :(得分:0)

您可以使用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()

答案 1 :(得分:0)

我们可以做得更好一点。只需获取名称,然后按时间排序,需要单独跳出硬盘驱动器以获取两个属性,这很慢。通过切换到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()可能会在一次或几次磁盘访问中获取所有文件的信息,并且这将是一个巨大的胜利。但是又一次......我不熟悉这里的细节;你必须自己测试哪种情况更好。