2012-11-06 44 views
0

我有以下代码仅返回最新的“X”文件

Public Function ListDirLatest(ByVal Dir As String, ByVal Amount As Integer) As DataTable   
    Dim dt As DataTable = ListDir(Dir) 
    If (dt Is Nothing) Then 
     Return Nothing 
    Else 
     Return dt ' This is where i would like to implement the latest x-files logic 
    End If 
End Function 

Private Function ListDir(ByVal Dir As String) As DataTable 
    If Directory.Exists(Dir) Then 
     Dim dt As DataTable = GetDT() 
     Dim dirinfo As New DirectoryInfo(Dir) 
     For Each fsi As FileSystemInfo In dirinfo.GetFileSystemInfos(".txt") 
      Dim dr As DataRow = dt.NewRow() 
      dr("FileName") = fsi.Name() 
      dr("FileDate") = fsi.CreationTime() 
     Next 
     Return dt 
    Else 
     Return Nothing 
    End If 
End Function 

Private Function GetDT() As DataTable 
    'Create DataTable to hold results 
    Dim dt As New DataTable("DirList") 
    Dim st As System.Type = System.Type.GetType("System.String") 
    dt.Columns.Add("FileName", st) 
    dt.Columns.Add("FileDate", st) 
    Return dt 
End Function 

目前的ListDirLatest函数将返回目录中的所有文件。 如何更改代码,使其仅返回Amount参数指定的最新'x'文件。

要澄清我想在目录中最新的“X”的文件中返回。

回答

2

你可以用一点点的LINQ和引用System.Data.DataSetExtensions
http://msdn.microsoft.com/en-us/library/system.data.datatableextensions(v=vs.100).aspx

解决您的问题210
Public Function ListDirLatest(ByVal Dir As String, ByVal Amount As Integer) As DataTable   
    Dim dt As DataTable = ListDir(Dir) 
    If (dt Is Nothing) Then 
     Return Nothing 
    Else 
     Dim r = from myRow in dt.AsEnumerable() 
       Order By("FileDate DESC") 
       Take(Amount) 
     dt = r.CopyToDataTable() 
     return dt 
    End If 
End Function 

此外,listdir同时功能有几个错误的

  • 添加该行信息DataTable中返回
  • 使用GetFileSystemInfos

    Function ListDir(ByVal Dir As String) As DataTable 
        If Directory.Exists(Dir) Then 
         Dim dt As DataTable = GetDT() 
         Dim dirinfo As New DirectoryInfo(Dir) 
         For Each fsi As FileSystemInfo In dirinfo.GetFileSystemInfos("*.txt") 
          Dim dr As DataRow = dt.NewRow() 
          dr("FileName") = fsi.Name() 
          dr("FileDate") = fsi.CreationTime() 
          dt.Rows.Add(dr) 
         Next 
         Return dt 
        Else 
         Return Nothing 
        End If 
    End Function 
    
+0

太好了!谢谢Linq真是太漂亮了! –

+0

只需注意:要在DataTable上使用'.AsEnumerable()',您必须将对System.Data.DataSetExtensions'名称空间/ dll的引用添加到项目 –

+0

正确,添加以回答完整性 – Steve

0

如果你的意思是按金额的文件的数量要返回,那么这里就是你需要做什么:

首先更改listdir同时函数的头部接受一个参数,允许计数的文件数是回来了,从第一功能传递参数,

Public Function ListDirLatest(ByVal Dir As String, ByVal Amount As Integer) As DataTable   
    Dim dt As DataTable = ListDir(Dir, Amount) 
    If (dt Is Nothing) Then 
     Return Nothing 
    Else 
     Return dt ' This is where i would like to implement the latest x-files logic 
    End If 
End Function 

Private Function ListDir(ByVal Dir As String, ByVal Amount As Integer) As DataTable 
    If Directory.Exists(Dir) Then 
     Dim dt As DataTable = GetDT() 
     Dim dirinfo As New DirectoryInfo(Dir) 
     Dim cnt as Integer = 0 
     For Each fsi As FileSystemInfo In dirinfo.GetFileSystemInfos(".txt") 
      Dim dr As DataRow = dt.NewRow() 
      dr("FileName") = fsi.Name() 
      dr("FileDate") = fsi.CreationTime() 
      cnt += 1 
      if cnt >= Amount Then Exit For 
     Next 
     Return dt 
    Else 
     Return Nothing 
    End If 
End Function 
+0

这将正确的模式只返回目录中第一个'x'个文件,这不一定是最新的 –

+0

您可以发布Ge (TDT) – Ahmad

+0

完成,它只是创建我的DataTable –