【问题标题】:vb.net cannot sort file namevb.net 无法对文件名进行排序
【发布时间】:2020-08-05 19:26:50
【问题描述】:

这是我的代码

Dim orderedFiles = New System.IO.DirectoryInfo(dir).GetFiles("file_*.jpeg").OrderBy(Function(x) x.Name)

For Each f As System.IO.FileInfo In orderedFiles
msgbox(f.name)
Next

显示

file_1.jpeg
file_10.jpeg
file_11.jpeg
file_12.jpeg
file_13.jpeg
file_14.jpeg
file_2.jpeg
file_3.jpeg
file_4.jpeg
file_5.jpeg
file_6.jpeg
file_7.jpeg
file_8.jpeg
file_9.jpeg

我希望他们按 1 - 2 - 3 排序...... 14
我该怎么做?

【问题讨论】:

  • 如果你不明确排序,你会得到什么顺序?
  • 它们已经正确排序。它们按它们的 ASCII 值排序,因此 1 后跟 10 是正确的顺序。解决此问题的常用方法是在单个数字的左侧添加零,如01,这将允许它们按您想要的顺序排序。如果这对您不起作用,您将不得不编写自己的代码来进行排序。
  • 我相信感兴趣的 API 是 StrCmpLogicalW
  • 我在 SO 上找不到 VB.Net 示例,但 Google 在 bytes.com/topic/visual-basic-net/answers/… 找到了一个
  • 问题解决了!我设置了每个文件名 padleft 000000 例如 000001000010 现在一切都很好。谢谢大家

标签: .net vb.net


【解决方案1】:

您可以在不更改文件名的情况下使用StrCmpLogicalW API 进行操作,例如

Imports System.IO
Imports System.Runtime.InteropServices

Module Module1

    <DllImport("shlwapi.dll", CharSet:=CharSet.Unicode)>
    Private Function StrCmpLogicalW(x As String, y As String) As Integer
    End Function

    Sub Main()
        Dim files = New DirectoryInfo("D:\johnm\Documents\Test").GetFiles()

        Array.Sort(files,
                   Function(file1, file2) StrCmpLogicalW(file1.Name, file2.Name))

        For Each file In files
            Console.WriteLine(file.Name)
        Next

        Console.ReadLine()
    End Sub

End Module

【讨论】:

    【解决方案2】:

    问题解决了!我只是用 padleft 设置每个文件名000000
    例如 000001000010 现在一切都很好

    代码

    Dim test1 As String = "1"
    test1 = test1.ToString.PadLeft(6, "0"c)
    

    显示

    000001
    

    【讨论】:

    • 你能解释一下这是如何与New System.IO.DirectoryInfo(dir).GetFiles("file_*.jpeg")一起工作的吗?
    • @Enigmativity,我也在想同样的事情。我只能假设 OP 指的是文件最初是如何创建的。
    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 2012-04-01
    • 1970-01-01
    • 2012-04-08
    • 2020-08-16
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多