使用 Dir 获取文件夹的文件列表

Get the file list of a folder with Dir

我正在尝试获取 VBA

中文件夹的文件列表

DIR 命令的作用就好像 * 通配符打乱了我输入的整个掩码。

这是我的文件列表:

我试过的原始掩码是“*.txt
应该 得到 3 个文件。
相反,我得到:3 .txt 文件和 .txt1.txta 个文件。

我测试了其他文件名和扩展名,如果我只使用问号,它工作正常,例如:
掩码:“???????.txt”returns 3 .txt 个文件。

尝试过的系统:
Windows11; Excel版本:2112
Windows10; Excel版本:2102
Windows98; Excel97

Sub test()

    Dim i As Integer
    Dim s As String
    
    i = 1
    
    s = Dir("*.txt")
    
    Do While (s <> "")
        Cells(i, 1) = s
        s = Dir
        i = i + 1
    Loop

End Sub

新发现:如果我使用超过 3 个字符的文件扩展名作为过滤器,它工作正常,它只 returns 所需的文件。我在 Windows 98 的命令提示符下发现 Windows 将 3 个字符的文件扩展名过滤器视为“基础”,并将类似文件(以该过滤器开头)也视为“TXT”,我想这是现代 Windows 版本也是如此,这就是故障存在的原因。我的猜测是,当使用 3 个字符的扩展过滤器时,它会使用 8.3 文件名格式进行搜索,而当使用更长的文件名时,它会使用正确的长文件名进行搜索。我刚刚发现了一个古老的 Windows 错误吗???

SAMPLE1  TXT             0  21.12.14  12.04 Sample1.txt
SAMPLE2  TXT             0  21.12.14  12.04 Sample2.txt
SAMPLE3  TXT             0  21.12.14  12.04 Sample3.txt
SAMPLE~1 TXT             0  21.12.14  12.04 Sample4.txt1
SAMPLE~2 TXT             0  21.12.14  12.04 Sample5.txta

有趣的事实:在 PowerShell 下,该命令使用 3 个字符的扩展过滤器。

我从来没有遇到过 Dir 的问题,但为了您的需要,请尝试这样的事情 -

Dim i As Long
Dim s As String, sPath As String, sFilter As String
    
    i = 1
    sPath = CurDir & "\"
    sFilter = "*.txt"    
    s = Dir(sPath, 15)
    
    Do While Len(s)
        If LCase(s) Like sFilter Then
            Cells(i, 1) = s
            i = i + 1
        End If
        s = Dir
    Loop

End Sub