【发布时间】:2022-01-17 17:15:33
【问题描述】:
我试图在 VBA 中获取文件夹的文件列表,但在使用 DIR 命令时遇到了问题,它的作用就像 * 通配符弄乱了我输入的整个掩码。
这是我的文件列表:
- NotAText.inf
- Sample1.txt
- Sample2.txt
- Sample3.txt
- Sample4.txt1
- Sample5.txta
我尝试使用的原始掩码是“*.txt”,所以我应该获得 3 个文件。但我得到的是:3 个 .txt 文件以及 .txt1 和 .txta 个文件。
我已经测试过其他文件名和扩展名,如果我只使用问号,它可以正常工作,例如:
掩码:“???????.txt”按原样返回 3 个 .txt 文件。
是否有人遇到与此处所述相同的故障?有谁可能知道导致此问题的现有问题? 尝试过的系统: 视窗 11; Excel版本:2112 视窗 10; Excel版本:2102 视窗 98; Excel 97
我可能遗漏了一些非常蹩脚的东西,但如果有人可以提供帮助,我将非常感激。 :)
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 个字符的文件扩展名作为过滤器,它可以正常工作,它只返回所需的文件。我在 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(在命令行和 VBA 中)还查看 Windows 出于兼容性原因保留的文件短名称(8.3 格式)。见stackoverflow.com/q/66674420/7599798 或stackoverflow.com/q/68287857/7599798 -
FWIW,使用
Application.GetOpenFileName不会发生这种现象:例如Application.GetOpenFilename("Text Files (*.txt), *.txt")将只返回.txt文件而不是.txt1等 -
考虑使用 FSO(文件系统对象),允许您直接访问文件扩展名,因此您不需要通配符。
-
@FunThomas 确实如此。我没有找到这个,自动建议也没有返回它。非常感谢!
标签: excel vba windows file directory