首页 > 解决方案 > 将目录放入数组,然后按创建日期对其文件进行排序

问题描述

我需要按创建日期对目录文件进行排序。我在这里和网上查看了解决方案;这主要指向我无法使用的 linq 用法,因为我的应用程序是 .net framework 2.0 的遗留应用程序。我也在使用.net vb。其他解决方案需要一个我也不想使用的类。我需要一个简单的排序解决方案,它将在一个数组中显示我的所有文件,从文件创建的最低日期到最高日期排序。

下面是我目前正在使用的代码;默认情况下按文件名排序。

            Dim trydef1 As String = D_Drive & "\Cloud Documents\"

            Dim txtFiles = Directory.GetFiles(trydef1)

            For Each filenm As String In txtFiles
            'process the file here
            Next

标签: vb.net

解决方案


如果不能使用 lambda 表达式,则必须使用类。阶级并没有什么坏处。与自定义比较器结合使用Array.Sort。不使用类的唯一另一种方法是自己实现类似 QuickSort 的排序算法。编写类更容易。

如果第一个值小于第二个值,比较器返回负值,如果两者相等则返回 0,如果第一个值大于第二个值,则返回正值。

public static void Sort (Array array, System.Collections.IComparer comparer);

您必须自己编写自定义比较器。您可以像在模块中一样在类中编写函数。使用上的主要区别在于类是创建对象的模板。因此,您必须使用New FileByDateComparer(). 优点是您可以将此对象作为参数传递给Array.Sort方法。你不能用模块做的事情。

Public Class FileByDateComparer
    Implements IComparer

    Public Function Compare(a As Object, b As Object) As Integer _
        Implements IComparer.Compare

        Dim fileA = DirectCast(a, FileInfo)
        Dim fileB = DirectCast(b, FileInfo)
        Dim comp = fileA.CreationTime.CompareTo(fileB.CreationTime)

        If comp <> 0 Then 'Dates are different
            Return comp
        End If

        'Dates are equal, sort by name
        Return fileA.Name.CompareTo(fileB.Name)
    End Function
End Class

比较器假定它是传递FileInfo对象而不是文件名作为字符串。

Dim files As FileInfo() = New DirectoryInfo(trydef1).GetFiles()
Array.Sort(files, New FileByDateComparer())

For Each fileInfo As FileInfo In files
    Console.WriteLine($"{fileInfo.Name} {fileInfo.CreationTime}")
Next

推荐阅读