0

我试图找出使用不包含 8.3 格式名称的通配符获取目录列表的最佳方法。我正在尝试使用通配符模式获取所有目录,例如"3626*"。问题是“Directory.GetDirectories andDirectoryInfo.GetDirectories”都包含长文件名和 8.3 格式名称。因此我得到了我不想要的条目。例如,使用上面的通配符,我得到了"3626 Burnt Chimney""3689 Lavista"。您可以使用命令提示符和命令"dir 3626*"看到相同的行为。这是在 Windows 7 32 位上。我怎样才能只返回长文件名?

4

2 回答 2

1

检索目录后执行过滤器,例如,

var files = new DirectoryInfo(@"C:\Path\")
                   .GetDirectories()
                   .Select(f => f.Name)
                   .Where(name => name.StartsWith("3626"));
于 2015-02-27T22:23:41.723 回答
0

您可以在此处找到更多信息:列出与模式匹配的文件夹中的文件

RagtimeWilly 的评论也是我想要建议的。

有关 8.3 名称的良好解释,请参见http://en.wikipedia.org/wiki/8.3_filename

我只是写了一个小例子,也许你可以以此为起点:

using System.Text.RegularExpressions;
...

Regex re83 = new Regex(@"^[^.]{1,8}(\.[^.]{0,3})?$");

DirectoryInfo directoryInfo = new DirectoryInfo("C:\\windows");

foreach (string no83 in directoryInfo.GetDirectories("i*").Select(di => di.Name).Where(n => !re83.IsMatch(n)))
{
    Console.WriteLine(no83);
}

在网上搜索,您会发现一些其他匹配 8.3 名称的正则表达式,有些更复杂。8.3 中不允许使用某些字符。名称,由那些处理。但是您可能只是对过滤掉一些不需要的路径名感兴趣。

于 2015-02-27T08:05:56.387 回答