2013-07-09 77 views
2

我打算在VBA中创建一些基本上将从根文件夹开始的一个或多个目录中的所有文件。长话短说,我使用filesystemobject运行所有的文件夹,然后获取这些文件夹中的所有文件。移动到下一个文件夹等VBA,FileSystemObject,Windows排序顺序

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

的Windows排序:

FolderTest\000 
FolderTest\0 
FolderTest\0001 

不要太奇怪,当使用FSO它返回的子文件夹在不同的(也许更符合逻辑)顺序:

FolderTest\0 
FolderTest\000 
FolderTest\0001 

我希望有人可能有什么人可以做的就是这一点的想法,因为它在Windows效果展示给使出。这仅仅是一个例子,这些文件可以被命名为任何东西,但对于名称中的字母字符,它似乎表现得更好。我不一定会结婚使用FSO,但我甚至不知道在哪里寻找替代品。我知道我可以将这些列入数组中,但我不确定需要什么样的魔术才能按照“适当”的顺序进行排序。就我所知,有一些方法或某些东西可以使这一切变得更好。预先感谢任何帮助!

+0

通过“窗口中的”,我想你的意思是“Windows资源管理器”,它通常排序的名字。因为这显然不是这种情况,所以我建议按修改日期或其他字段对它进行排序。如果不知道,我们无法真正回答你的问题。 – paddy

+0

@paddy在Windows资源管理器中,文件夹绝对按名称排序。 – Finch042

+0

可能值得注意的是,文件在Windows资源管理器中“排序”的方式仅仅是它们显示给用户的方式。 FSO按照逻辑顺序返回它们。使用'DIR'函数返回文件的顺序相同,但速度比FSO快。考虑到这一点,这是一个重复的问题,BrettDJ的答案应该指向正确的方向。 HTTP://计算器。com/a/8691872/1467082 –

回答

1

啊,我现在明白了。我用数字名称做了一堆目录,看看发生了什么。 Windows资源管理器会对值进行整数转换。排序规则是这样的:

numeric value : ascending 
padding length : descending 

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

Numeric folder names in Explorer

+0

为了跟进,我刚刚发现[这个老帖子](http://stackoverflow.com/questions/442429/windows-explorer-sort-method)其中包含一个很好的链接。这个问题比我建议的更复杂,因为文件名也可以用数字作为后缀。 – paddy

+0

该资源是一个很大的帮助。如果我说实话,我很可能需要把它弄糟......好吧,很长一段时间,但我比以前好多了。非常感谢。 – Finch042

1

为了谁最终可能帮助,下面的代码看起来像它给我,我一直在寻找的结果,转换子文件夹列表到相同的排序顺序,你(可能)找到在Windows资源管理器。从文件系统对象进入子文件夹,它将结果排出到数组中(fnames)。代码...它不漂亮。我会第一个承认它。不要太苛刻地评价我。非常感谢@Paddy(见上文)指着我对StrCmpLogicalW(http://msdn.microsoft.com/en-us/library/windows/desktop/bb759947(v=vs.85).aspx

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