【问题标题】:C# How to GetDirectories without 8.3 format namesC# 如何在没有 8.3 格式名称的情况下获取目录
【发布时间】:2015-02-27 07:00:01
【问题描述】:

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

【问题讨论】:

  • 为什么不能在检索目录后进行过滤,例如var files = new DirectoryInfo(@"C:\Path\").GetDirectories().Select(f => f.FullName).Where(name => name.StartsWith("3626"));
  • 关闭短名称支持应该是每个 LAN 管理员的待办事项列表中的一个项目符号,该功能今天完全没有任何剩余价值。确保这不会造成麻烦的最佳方法是确保每个人都启动 64 位操作系统,它不能再运行旧的 16 位代码。然而,这很少取决于程序员,在这种情况发生之前,您需要在代码中过滤结果。
  • @RagtimeWilly,您的语法很接近,d.Name 而不是 d.FullName,并且因为我正在寻找目录而不是文件,所以我对其进行了一些更改:var dirs = new DirectoryInfo(outputFolder).GetDirectories().Select(d => d.Name).Where(name => name.StartsWith(prefix)); 这有效,但我有真的想使用 Directory 类而不是 DirectoryInfo 因为我不想要开销并最终得到这个:var outputDirectories = Directory.GetDirectories(outputFolder, prefix + "*").Where(path => Path.GetFileName(path).StartsWith(prefix)); 如果您将发布为答案,我会标记它。
  • @dblwizard 发布为答案 :)

标签: c# directory directoryinfo getdirectories


【解决方案1】:

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

var files = new DirectoryInfo(@"C:\Path\")
                   .GetDirectories()
                   .Select(f => f.Name)
                   .Where(name => name.StartsWith("3626"));

【讨论】:

    【解决方案2】:

    您可以在此处找到更多信息:List files in folder which match pattern

    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 中不允许使用某些字符。名称,由那些处理。但您可能只是对过滤掉一些不需要的路径名感兴趣。

    【讨论】:

    • 我完全理解为什么会发生这种情况,只是无法相信没有任何标志或其他我缺少的方法会返回长名称......看起来很简单。
    • 我很清楚这种情况。我经常有一个可行的解决方案并认为“这真的这么复杂吗”并寻找一些更简单或明显的解决方案:-)
    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 2011-11-15
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2011-01-23
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多