【问题标题】:Configuration SearchPattern in EnumerateFilesEnumerateFiles 中的配置 SearchPattern
【发布时间】:2012-06-04 10:43:43
【问题描述】:

我有一个包含 2 个文件的目录:

  • file1.xls
  • file2.xlsx

如果我这样做:

directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)

它返回两个文件,我只想要第一个(file1.xls)。我该怎么做?

谢谢!

【问题讨论】:

    标签: c# .net c#-4.0 directoryinfo


    【解决方案1】:

    这可以使用 .Except() 并且应该更快:

       var dir = new DirectoryInfo(myFolderPath);
       ICollection<FileInfo> files = dir.EnumerateFiles("*.xls").Except(dir.EnumerateFiles("*.xls?")).ToList();
    

    您可以使用 Union(s) 添加更多扩展。总体而言,这更清洁(我相信它更快,尽管尚未测试)。海事组织

    【讨论】:

      【解决方案2】:

      看起来,DirectoryInfo 类使用 Win32 调用 FindFirstFile

      这仅允许通配符:

      * 匹配任意字符

      ? 匹配 0 个或多个字符 - 请参阅 comments

      因此,您必须自己过滤结果,可能使用以下方法:

      directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
                   .Where(fi => fi.Extension == ".xls");
      

      【讨论】:

      • 谢谢。您的回答非常完整
      【解决方案3】:

      这实际上是一种预期的行为。这很奇怪,但它已被记录在案。

      MSDN上我们可以读到一句话:

      在 searchPattern 中使用星号通配符(例如“*.txt”)时,扩展名正好是三个字符时的匹配行为与扩展名长度多于或少于三个字符时的匹配行为不同。文件扩展名正好为三个字符的 searchPattern 返回具有三个或更多字符扩展名的文件,其中前三个字符与 searchPattern 中指定的文件扩展名匹配。具有一个、两个或三个以上字符的文件扩展名的 searchPattern 仅返回具有与 searchPattern 中指定的文件扩展名完全匹配的扩展名的文件。使用问号通配符时,此方法仅返回与指定文件扩展名匹配的文件。例如,给定目录中的两个文件“file1.txt”和“file1.txtother”,“file?.txt”的搜索模式只返回第一个文件,而“file*.txt”的搜索模式返回两个文件。

      【讨论】:

        【解决方案4】:

        您可以使用IEnumerable.First()IEnumerable.FirstOrDefault() 扩展方法, 或者如果模式很重要,请更正您的枚举搜索模式。

        【讨论】:

        • First 或 FirstOrDefault 对我无效,因为如果目录中有 file1.xls、file2.xlsx 和 file3.xls 我需要 file1.xls 和 file3.xls 你的其他选项。如何更正我的枚举搜索模式?
        【解决方案5】:

        类似这样的:

        directoryInfo.EnumerateFiles(".xls",SearchOption.TopDirectoryOnly)
            .Where( f => Path.GetExtension( f ) == ".xls" );
        

        【讨论】:

        • 谢谢。这就是我需要的
        • 这不会编译,即使您在 EnumerateFiles 调用中包含 searchPattern 变量。可枚举的类型是 FileInfo(请参阅我的答案)。
        • 是的,但是这个例子是我的基础。最后我做 ExtensionsToSearch.SelectMany(pattern => directoryInfo.EnumerateFiles("*." + pattern, SearchOption.TopDirectoryOnly).Where(fileInfo => Path.GetExtension(fileInfo.FullName) == "." + pattern ))跨度>
        • @gt,谢谢,我是凭记忆输入的。我认为类 Directory 作为基础而不是 DirectoryInfo 作为问题,我认为它可能已经编译了。
        • @Pedre “是的,但是这个例子是我的基础。” - 推广不能像 gt 所说的那样编译的代码对世界没有好处
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-20
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多