首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileSystemObject、Windows排序顺序

FileSystemObject、Windows排序顺序
EN

Stack Overflow用户
提问于 2013-07-09 09:37:27
回答 2查看 4.7K关注 0票数 2

我想在VBA中做一些东西,基本上列出一个或多个目录中的所有文件,从根文件夹开始。长话短说,我使用filesystemobject遍历所有文件夹,然后获取这些文件夹中的所有文件。移动到下一个文件夹,等等。

我遇到的问题是,我需要以与Windows中相同的文件夹排序顺序输出我的数据(在工作表上)。我知道这不是一个固定的概念,所以这里有一个简单的例子,因为它显示在Windows中(对我来说):

Windows排序顺序:

代码语言:javascript
复制
FolderTest\000
FolderTest\0
FolderTest\0001

毫不奇怪,当使用FSO时,它以不同(可能更符合逻辑)的顺序返回子文件夹:

代码语言:javascript
复制
FolderTest\0
FolderTest\000
FolderTest\0001

我希望有人知道该怎么做才能让它在Windows中显示出来。这只是一个例子,显然,文件可以命名为任何名称,但它的名称中肯定有字母字符的表现要好得多。我不一定喜欢使用FSO,但我甚至不知道还能去哪里寻找替代方案。我知道我可以在数组中对它们进行排序,但我不确定需要什么样的魔法才能使它以“正确”的顺序排序。据我所知,有一些方法或东西可以让这一切变得更好。提前感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-09 10:02:54

啊,我现在明白了。我做了一堆带有数字名称的目录,看看是怎么回事。Windows资源管理器对该值执行整数转换。排序规则如下:

代码语言:javascript
复制
numeric value   : ascending
padding length  : descending

因此,如果有01001,两者的计算结果都是整数1,但001将首先出现,因为它更长(有更多的补零)。这种情况下的' length‘仅指数字部分(即填充),不受后面出现的任何字符的影响(它们仅在数值和填充长度相同时才重要-然后正常排序适用):

票数 0
EN

Stack Overflow用户

发布于 2013-07-09 11:25:44

对于任何可能会有帮助的人来说,下面的代码看起来像是给了我我想要的结果,将子文件夹列表转换为您(可能)在Windows资源管理器中找到的相同排序顺序。从Filesystem对象进给子文件夹,它将结果输出到一个数组(Fname)中。代码..。这不是很漂亮。我会第一个承认这一点。别太苛刻地评判我。非常感谢@Paddy (见上文)为我指明了StrCmpLogicalW (http://msdn.microsoft.com/en-us/library/windows/desktop/bb759947(v=vs.85).aspx

代码语言:javascript
复制
Private Declare PtrSafe Function StrCmpLogicalW Lib "shlwapi" _
(ByVal s1 As String, ByVal s2 As String) As Integer

Sub filefoldersortWindows()
Dim folder As String
Dim fnames() As String, buffer As String, content As String

folder = "Your Path"
 Set fsol = CreateObject("Scripting.fileSystemObject")
Set fold = fsol.GetFolder(folder)
FoldCount = fold.SubFolders.Count

ReDim fnames(FoldCount)
cFcount = 0
For Each fld In fold.SubFolders
    cFcount = cFcount + 1
    Namer$ = fld.Name

   fnames(cFcount) = StrConv(Namer, vbUnicode)
Next
For AName = 1 To FoldCount
    For BName = (AName + 1) To FoldCount
        If StrCmpLogicalW(fnames(AName), fnames(BName)) = 1 Then
            buffer = fnames(BName)
            fnames(BName) = fnames(AName)
            fnames(AName) = buffer
        End If
    Next
Next
For i = 1 To FoldCount
   fnames(i) = StrConv(fnames(i), vbFromUnicode)
    If i > 1 Then
    content = content & "," & fnames(i)
    Else
    content = fnames(i)
    End If
Next



End Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17538620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档