sortingDirectory.GetFiles()

System.IO.Directory.GetFiles()返回一个string[] 。 什么是返回值的默认sorting顺序? 我假设名字,但如果是这样,目前的文化影响了多less? 你可以改变它像创builddate?

更新: MSDN指出sorting顺序不能保证.net 3.5,但2.0版本的页面并没有说什么都没有,页面将帮助你sorting的东西,如创build或修改时间。 一旦你有数组(它只包含string),这些信息就会丢失。 我可以build立一个比较器来检查它得到的每个文件,但是这意味着当可能.GetFiles()方法已经做到这一点时,重复访问文件系统。 看起来效率很低。

如果您对CreationTime等文件属性感兴趣,那么使用System.IO.DirectoryInfo.GetFileSystemInfos()会更有意义。 然后,您可以使用System.Linq中的某个扩展方法对这些进行sorting,例如:

 DirectoryInfo di = new DirectoryInfo("C:\\"); FileSystemInfo[] files = di.GetFileSystemInfos(); var orderedFiles = files.OrderBy(f => f.CreationTime); 

编辑 – 对不起,我没有注意到.NET2.0标签,所以忽略了LINQsorting。 尽pipe使用System.IO.DirectoryInfo.GetFileSystemInfos()的build议仍然成立。

在.NET 2.0中,您将需要使用Array.Sort对FileSystemInfos进行sorting。

另外,您可以使用Comparer委托来避免为了比较而声明一个类:

 DirectoryInfo dir = new DirectoryInfo(path); FileSystemInfo[] files = dir.GetFileSystemInfos(); // sort them by creation time Array.Sort<FileSystemInfo>(files, delegate(FileSystemInfo a, FileSystemInfo b) { return a.LastWriteTime.CompareTo(b.LastWriteTime); }); 

这是我用过的VB.Net解决scheme。

先做个class级比较date:

 Private Class DateComparer Implements System.Collections.IComparer Public Function Compare(ByVal info1 As Object, ByVal info2 As Object) As Integer Implements System.Collections.IComparer.Compare Dim FileInfo1 As System.IO.FileInfo = DirectCast(info1, System.IO.FileInfo) Dim FileInfo2 As System.IO.FileInfo = DirectCast(info2, System.IO.FileInfo) Dim Date1 As DateTime = FileInfo1.CreationTime Dim Date2 As DateTime = FileInfo2.CreationTime If Date1 > Date2 Then Return 1 If Date1 < Date2 Then Return -1 Return 0 End Function End Class 

然后在sorting数组时使用比较器:

 Dim DirectoryInfo As New System.IO.DirectoryInfo("C:\") Dim Files() As System.IO.FileInfo = DirectoryInfo.GetFiles() Dim comparer As IComparer = New DateComparer() Array.Sort(Files, comparer) 
 Dim Files() As String Files = System.IO.Directory.GetFiles("C:\") Array.Sort(Files) 

从msdn :

返回的文件名的顺序不能保证; 如果需要特定的sorting顺序,请使用Sort()方法。

Sort()方法是标准的Array.Sort(),它接受IComparables(以及其他重载),所以如果按创builddatesorting,它将根据机器设置处理本地化。

你可以实现自定义iComparer来进行sorting。 阅读文件的文件信息,并根据你的喜好进行比较。

 IComparer comparer = new YourCustomComparer(); Array.Sort(System.IO.Directory.GetFiles(), comparer); 

msdn info IComparer接口

MSDN文档指出,不能保证任何返回值的顺序。 你必须使用Sort()方法。

你是正确的,默认是我的名字升序。 我发现改变sorting顺序的唯一方法是从FileInfo集合中创build一个数据表。

然后,您可以使用数据表中的DefaultView,并使用.Sort方法对目录进行sorting。

这是相当涉及和相当缓慢,但我希望有人会发布更好的解决scheme。

你可以编写一个自定义的IComparer接口来按创builddatesorting,然后将其传递给Array.Sort。 你可能也想看看StrCmpLogical,这是用来做sorting浏览器使用(用文本正确sorting数字)。

如果你想按照创builddate进行sorting,你可能需要使用DirectoryInfo.GetFiles,然后使用合适的谓词对结果数组进行sorting。

一个更简洁的VB.Net版本…是非常好的。 谢谢。 要以相反的顺序遍历列表,请添加相反的方法…

 For Each fi As IO.FileInfo In filePaths.reverse ' Do whatever you wish here Next 

只是一个想法。 我喜欢find一个简单的方法,并尝试重新使用已有的资源。 如果我要对文件进行sorting,我只需创build一个进程并将syscal设置为“DIR [x:\ Folders \ SubFolders *。*] / s / b / on”并捕获输出。

使用系统的DIR命令,您可以按以下方式sorting:

 /O List by files in sorted order. sortorder N By name (alphabetic) S By size (smallest first) E By extension (alphabetic) D By date/time (oldest first) G Group directories first - Prefix to reverse order The /S switch includes sub folders 

我不确定如果D =按date/时间正在使用LastModifiedDate或FileCreateDate。 但是如果所需的sorting顺序已经内置在DIR命令中,我将通过调用系统调用来获得。 这是快速的。 我只是懒惰的家伙;)

经过一些Googlesearch,我发现切换按特定的date/时间sorting: –

 /t [[:]TimeField] : Specifies which time field to display or use for sorting. The following list describes each of the values you can use for TimeField. Value Description c : Creation a : Last access w : Last written 

一个更简洁的VB.Net版本,如果有人感兴趣

 Dim filePaths As Linq.IOrderedEnumerable(Of IO.FileInfo) = _ New DirectoryInfo("c:\temp").GetFiles() _ .OrderBy(Function(f As FileInfo) f.CreationTime) For Each fi As IO.FileInfo In filePaths ' Do whatever you wish here Next