对Directory.GetFiles()进行排序

Joe*_*orn 64 .net .net-2.0

System.IO.Directory.GetFiles()返回一个string[].返回值的默认排序顺序是什么?我是按名字假设,但如果是这样的话,目前的文化对它有多大影响呢?你能把它改成创建日期吗?

更新: MSDN指出.Net 3.5不保证排序顺序,但2.0版本的页面根本没有说什么,这两个页面都不会帮助您按创建或修改时间等方式进行排序.一旦你有了数组(它只包含字符串),这些信息就会丢失.我可以构建一个比较器来检查它获得的每个文件,但这意味着重复访问文件系统,大概是.GetFiles()方法已经这样做了.似乎非常低效.

Ian*_*son 109

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

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

编辑 - 抱歉,我没有注意到.NET2.0标记,因此忽略LINQ排序.尽管如此,使用System.IO.DirectoryInfo.GetFileSystemInfos()的建议仍然存在.

  • 乔尔,你看错了对象.System.IO.Directory具有GetFileSystemEntries方法.我的建议是使用System.IO.DirectoryInfo,它具有GetFileSystemInfos方法.希望这可以帮助. (3认同)

Chr*_*her 13

在.NET 2.0中,您需要使用Array.Sort对FileSystemInfos进行排序.

此外,您可以使用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);
                                    });
Run Code Online (Sandbox Code Playgroud)


seb*_*aan 12

这是我用过的VB.Net解决方案.

首先制作一个比较日期的课程:

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
Run Code Online (Sandbox Code Playgroud)

然后在对数组进行排序时使用比较器:

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)
Run Code Online (Sandbox Code Playgroud)


Kib*_*bee 7

Dim Files() As String
Files = System.IO.Directory.GetFiles("C:\")
Array.Sort(Files)
Run Code Online (Sandbox Code Playgroud)


Guy*_*uck 6

来自msdn:

返回的文件名顺序无法保证; 如果需要特定的排序顺序,请使用Sort()方法.

排序()方法是标准的Array.Sort(),它在IComparables(其他重载之间),因此,如果您按创建日期,它会根据机器设置的处理本地化.