VB6列表框在不同操作系统中的排序方式不同

时间:2018-10-05 19:56:13

标签: sorting vb6

我正在使用VB6应用程序,其中一些客户使用旧版本,而某些客户使用新版本。

在新版本中,存在一个使用FileSystemObject和For Each循环填充目录子文件夹的列表框:

Dim objFileSys As New FileSystemObject
Dim myFolder as Folder
Set myFolder = objFileSys.GetFolder(Path)
For Each mysubfolder In myFolder.SubFolders
    listbox1.AddItem mysubfolder.Name
Next

在旧版本中,使用Dir $函数:

Dim DirName As String
DirName = Dir$(Path, ATTR_DIRECTORY)
Do While DirName <> ""
  If DirName <> "." And DirName <> ".." Then
    If (GetAttr(Path & DirName) And ATTR_DIRECTORY) = ATTR_DIRECTORY Then
      listbox1.AddItem DirName
    End If
  End If
  DirName = Dir$
Loop

在旧版本中,listbox1.sort属性为true,在新版本中,listbox1.sort属性为false。没有代码可以执行任何排序。

在这里很奇怪。在Windows 10中运行应用程序时,列表框在两个版本中均正确排序。当我在Windows 7中运行该应用程序时,旧版本(具有listbox.sort = true的版本)未正确排序,但新版本(具有listbox.sort = false的版本)未正确排序。

什么可能导致这种情况发生?

1 个答案:

答案 0 :(得分:0)

这很可能取决于操作系统中文件系统API调用返回文件的顺序。也可能取决于所使用的文件系统。

许多文件系统不是本质上排序的结构,但是用于表示它们的客户端软件通过排序(例如)来掩盖这一事实。文件和文件夹列表。

例如Flash MP3播放器的一个常见问题是人们将音乐文件复制到其中,导致播放不正常,因为固件只是按照文件分配表中出现的顺序读取文件,而忽略文件名(即使他们使用{ {1}}这种名称。

听起来其中之一是正确的

  • Windows 10 API返回文件名列表时对文件名进行排序
    • 考虑到MS对向后兼容性的狂热,我不确定这是真的,尤其是因为所有用户软件都早已习惯了未排序的列表
  • 您的Windows 10系统较新,并且文件已重新复制到该系统上
    • 这意味着文件以复制时的实际顺序在磁盘上,这可能是排序顺序
    • Windows 7盒可能已经有一段时间了,并且它们以未排序的顺序写在磁盘上
    • 因此,幸运的是,“旧”代码可在Windows 10上运行

这样可以解释“随机”排序顺序。


回到VB6:VB6 ListBox控件的Sorted属性是所谓的“ Action”属性-对其进行设置。填充列表时,该控件不会对列表进行排序。填充列表,然后设置.Sorted属性。

新代码可能会产生一个排序列表,因为FileSystemObject的行为与01 - track name不同(即,它可能对文件进行排序是因为这很常见)

Dir$()