GetFiles排序的最佳方式

时间:2015-05-01 15:01:01

标签: vb.net sorting

我正在尝试按以下顺序对以下文件进行排序:

TMP_SDF_1180741.PDF
TMP_SDF_1179715.PDF
TMP_SDF_1162371.PDF
TMP_SDF_1141511.PDF
TMP_SDF_1131750.PDF
TMP_SDF_1117362.PDF
TMP_SDF_1104199.PDF
TMP_SDF_1082698.PDF
TMP_SDF_1062921.PDF
TMP_SDF_1043875.PDF
TMP_SDF_991514.PDF
TMP_SDF_970621.PDF
TMP_SDF_963154.PDF
TMP_SDF_952954.PDF
TMP_SDF_948067.PDF
TMP_SDF_917669.PDF
TMP_SDF_904315.PDF
TMP_SDF_899902.PDF
TMP_SDF_892398.PDF
TMP_SDF_882024.PDF

但实际输出是这样的:

TMP_SDF_991514.PDF
TMP_SDF_970621.PDF
TMP_SDF_963154.PDF
TMP_SDF_952954.PDF
TMP_SDF_948067.PDF
TMP_SDF_917669.PDF
TMP_SDF_904315.PDF
TMP_SDF_899902.PDF
TMP_SDF_892398.PDF
TMP_SDF_882024.PDF
TMP_SDF_1180741.PDF
TMP_SDF_1179715.PDF
TMP_SDF_1162371.PDF
TMP_SDF_1141511.PDF
TMP_SDF_1131750.PDF
TMP_SDF_1117362.PDF
TMP_SDF_1104199.PDF
TMP_SDF_1082698.PDF
TMP_SDF_1062921.PDF
TMP_SDF_1043875.PDF

我试过通过GetFiles研究排序方法,但是当我应用它们时,我得到的系统集合错误无法绑定到一维数组,这令人沮丧。这是我的代码:

Dim di As New IO.DirectoryInfo("C:\temp")
        Dim aryFi As IO.FileInfo() = di.GetFiles("*.PDF")
        Dim fi As IO.FileInfo       
        For Each fi In aryFi
            My.Computer.FileSystem.RenameFile("C:\TEMP\" & fi.Name, listBox1.SelectedItem.ToString & ".pdf")
            listBox1.SelectedIndex = listBox1.SelectedIndex - 1
        Next

我正在将文件重命名为a1 a2 a3等,这样当我在PDF中组合时,它们按时间顺序排列。我想要排序的方式,将按时间顺序排列。我相信有一种更简单的方法。如您所知,PDF文件(1180741)中的数字越高,文件内容的最新日期。而882024将是最早的文件内容。

2 个答案:

答案 0 :(得分:2)

正如评论中所述,您需要按数字而不是按字母顺序对它们进行排序。我不知道Windows资源管理器使用的特定排序算法,或者它是否可以使用相同的库,但是它当然可以编写您自己的算法,然后根据需要进行排序

这样做的第一步是仅提取要用作排序键的数字部分。在不了解更多细节的情况下,很难说出最佳选择是什么。如果您知道该数字始终从字符串中的特定字符位置开始,则只需使用String.SubString即可。如果它始终由" _"和"。"你可以使用String.Split。如果您需要更复杂的东西,或者您需要可配置解析规则,您可能需要考虑使用RegEx。例如,这是一个使用String.Split的简单示例方法:

Public Function GetSortKey(fileName As String) As Integer
    Return Integer.Parse(fileName.Split({"_"c, "."c})(2))
End Function

一旦你有一个提取给定文件名的排序键的方法,你就可以用它来对它们进行排序:

di.GetFiles("*.PDF").OrderBy(Function(x) GetSortKey(x.Name))

答案 1 :(得分:0)

也许你可以利用手上的一些工具

    Dim reg As RegEx = new RegEx("\d+")
    Dim ordered = new List(Of OrderedFiles)()
    for each s in Directory.GetFiles("C:\temp", "*.PDF")
        Dim aFile = new OrderedFiles() 
        aFile.FileName = s
        aFile.Sequence = Convert.ToInt32(reg.Match(s).Value)
        ordered.Add(aFile)
    Next

    for each aFile in ordered.OrderByDescending(Function(x) x.Sequence)
        Console.WriteLine(Path.GetFileName(aFile.FileName))
    Next
End Sub


Class OrderedFiles
    Public FileName as String
    Public Sequence as Integer
End Class

在此示例中,您有一个自定义类,其中包含要排序的文件名和数字部分。然后,将匹配文件中任何数值的Regex表达式应用于您的文件,以使用名称和数字部分构建类的实例。在循环结束时,只需调用Linq方法,该方法按降序排列列表