2017-08-31 367 views
0

我有一個Xml文件的目錄。如何只抓取過去30天內創建的文件並按升序對其進行排序?如果有更有效的解決方案,我不會使用Directory.GetFiles。VB.NET Directory.GetFiles按日期排序

然後,我創建一個文件列表並將其綁定到一個gridView,在該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() 

回答

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() 
+0

謝謝!我只需要抓取過去30天內創建的文件。 – 80sRocker

+0

@ 80sRocker:相應編輯 –

+0

@ 80sRocker不要忘記'Date.Today'可以在代碼運行時更改,以防重大。 –

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()獲得所有的文件在一次或幾次旅行中的信息,這將是一個巨大的勝利。但是,再次......我不熟悉這裏的細節;你必須爲自己測試哪種情況更好。