2009-11-10 79 views
1

我不认为,System.Collections.ObjectModel有任何排序或按功能排序。排序按文件日期收集

我有一个文件列表,我想按文件日期排序。

Dim list AS System.Collections.ObjectModel.ReadOnlyCollection(Of String) 
list = My.Computer.FileSystem.GetFiles("C:\SearchFolder" _ 
    , FileIO.SearchOption.SearchByTopLevelOnly _ 
    , "TheFileName*.txt") 

Dim sTheLastFile AS String 

sTheLastFile = list.Max() 

这将返回最后一个文件,但是基于文件名而不是日期。我想我需要添加 .OrderBy(...只是无法得到的那部分。

回答

1
using System.IO; 

public static void Main() 
{ 
    DirectoryInfo di = new DirectoryInfo("c:\\temp\\"); 
    FileSystemInfo[] files = di.GetFileSystemInfos("*.mp3"); 
    printFiles(files); 

    Array.Sort(files, CompareFileByDate); 
    printFiles(files); 

} 

public static int CompareFileByDate(FileSystemInfo f1, FileSystemInfo f2) 
{ 
    return DateTime.Compare(f1.LastWriteTime, f2.LastWriteTime); 
} 

public static void printFiles(FileSystemInfo[] files) 
{ 
    foreach(FileSystemInfo file in files) 
    { 
     Console.WriteLine(file.Name); 
    } 
    Console.WriteLine("********************************"); 
} 

看看这可以帮助您在所有。

我用LastWriteTime属性。您可以选择任何一个为你的作品(CreationTimeLastAccessTime

编辑:当然,这可以转换为使用C#3.0 & lambda表达式的支持更紧凑的语法

EDIT2:

from file in new DirectoryInfo(@"c:\temp\").GetFileSystemInfos("*.mp3") 
orderby file.LastWriteTime 
select file 

EDIT3:上面的C#代码

from file in new DirectoryInfo("c:\temp\").GetFileSystemInfos("*.mp3") _ 
order by file.LastWriteTime _ 
select file 

EDIT4的vb.net版:这是你在找什么?
这会给你最大的。所有* .mp3文件的LastWriteTime的日期。

(from file in new DirectoryInfo("c:\temp\").GetFileSystemInfos("*.mp3") _ 
order by file.LastWriteTime descending _ 
select file.LastWriteTime).Take(1) 

OR

(from file in new DirectoryInfo("c:\temp\").GetFileSystemInfos("*.mp3") _ 
select file.LastWriteTime).Max() 
+0

(你必须为你需要的每个标准;-)添加私人助手类)。 LastWriteTime到我的代码? – JeffO 2009-11-10 19:38:31

+0

上面没有任何代码示例有帮助吗?你能否用预期的方式编辑你的问题,记住在这个答案中发布的代码示例? – shahkalpesh 2009-11-10 20:09:45

0

要做到这一点,请尝试以下...

安装一个新的类实现IComparer接口。这将用于执行比较。 IComparer提供了一种自定义集合的排序顺序的方法。请注意,下面的示例使用LastWriteTime作为比较的基础,但可以将其更改为您认为合适的任何属性。

Public Class clsCompareFileInfo 
    Implements IComparer 
    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare 
     Dim File1 As FileInfo 
     Dim File2 As FileInfo 

     File1 = DirectCast(x, FileInfo) 
     File2 = DirectCast(y, FileInfo) 

     Compare = DateTime.Compare(File1.LastWriteTime, File2.LastWriteTime) 
    End Function 
End Class 

然后,抓住文件集合并执行以下操作来相应地对文件进行排序。

Dim dirinfo As DirectoryInfo = New DirectoryInfo("C:\SearchFolder") 
     Dim allFiles() As FileInfo = dirinfo.GetFiles("TheFileName*.txt", SearchOption.TopDirectoryOnly) 
     Array.Sort(allFiles, New clsCompareFileInfo) 
     For Each fl As FileInfo In allFiles 
      MsgBox(fl.FullName.ToString()) 
     Next 
+0

您的第一行创建错误:类型'System.Collections.ObjectModel.ReadOnlyCollection(Of String)'的值无法转换为'System.IO.FileInfo'的一维数组' – JeffO 2009-11-10 22:01:19

+0

代码已被修改,请尝试以上 – Jakkwylde 2009-11-12 15:21:18

0

有了这个类,您可以订购使用此时,相应的标准文件,我将如何通过文件拿到订单


Imports System.IO 

Class FilesTools 
    Private Class HelperSortByLastWriteTimeAsc 
     Implements IComparer(Of FileInfo) 

     Public Function Compare(ByVal x As System.IO.FileInfo, _ 
           ByVal y As System.IO.FileInfo) As Integer Implements System.Collections.Generic.IComparer(Of System.IO.FileInfo).Compare 
      Return Date.Compare(x.LastWriteTime, y.LastWriteTime) 
     End Function 
    End Class 

    Private Class HelperSortByLastWriteTimeDesc 
     Implements IComparer(Of FileInfo) 

     Public Function Compare(ByVal x As System.IO.FileInfo, _ 
           ByVal y As System.IO.FileInfo) As Integer Implements System.Collections.Generic.IComparer(Of System.IO.FileInfo).Compare 
      Return Date.Compare(y.LastWriteTime, x.LastWriteTime) 
     End Function 
    End Class 

    Public Shared Function sortByLastTime() As IComparer(Of FileInfo) 
     Return New HelperSortByLastWriteTimeAsc 
    End Function 

    Public Shared Function sortByLastTimeDesc() As IComparer(Of FileInfo) 
     Return New HelperSortByLastWriteTimeDesc 
    End Function 

    Public Shared Function GetFilesSorted(ByVal path As String, _ 
              ByVal sort As IComparer(Of FileInfo)) As FileInfo() 
     Dim info As FileInfo() 
     info = New DirectoryInfo(path).GetFileSystemInfos() 

     Array.Sort(Of FileInfo)(info, sort) 

     Return info 
    End Function 

End Class