如何使用 GetFiles() 搜索包含 doc 文件但排除 docx 文件?

Posted

技术标签:

【中文标题】如何使用 GetFiles() 搜索包含 doc 文件但排除 docx 文件?【英文标题】:How to use GetFiles() search to include doc files but excude docx files? 【发布时间】:2016-05-14 07:00:04 【问题描述】:

目前我正在像这样循环访问我的文件系统

For Each filename As String In Directory.GetFiles(sourceFolder, "*.doc")

不过,这会将 docx 文件包含在 GetFiles 返回的文件列表中。我希望只搜索 doc 文件而不是 docx。是否知道我可以在搜索模式中使用截断或停止搜索字符?

【问题讨论】:

Directory.GetFiles(sourceFolder, "*.doc", System.IO.SearchOption.TopDirectoryOnly).Where(Function(q) q.EndsWith("x") = False).ToArray() 如果你使用了DirectoryInfo,你可以过滤实际的扩展名 【参考方案1】:

这是GetFiles的默认行为,你可以使用LINQ做进一步的过滤。

var files = Directory.GetFiles(@"C:\test", "*.doc")
             .Where(file=> file.EndsWith(".doc", StringComparison.CurrentCultureIgnoreCase))
             .ToArray();//If you want an array back

Directory.GetFiles Method (String, String)

当您在 searchPattern 中使用星号通配符时 如“*.txt”,指定扩展名中的字符数 对搜索的影响如下:

如果指定的扩展名正好是三个字符,则该方法返回扩展名以指定扩展名开头的文件。例如,“*.xls”返回“book.xls”和“book.xlsx”。

【讨论】:

它有效,但你能解释一下 StringComparison 参数的作用吗? 这是正确答案。不幸的是,没有更清洁的方法可以做到这一点,但似乎确实没有。 @codemonkeyliketab,当然,后面的比较是在字符串值上执行的,现在你可以得到一个扩展名DOCdoc(不同的大小写),StringComparison参数正在做与忽略大小写比较,因此 DOCdoc 将被视为相同【参考方案2】:

鉴于您想要迭代文件并考虑这些方法的默认行为,我建议使用 EnumerateFiles 而不是 GetFiles。通过这种方式,您可以对当前文件的扩展名添加一个简单的检查

foreach(string filename in Directory.EnumerateFiles(sourceFolder, "*.doc"))

   if(!filename.EndsWith("x", StringComparison.CurrentCultureIgnoreCase))
   
      .....
   
    

不像 Linq 唯一的解决方案那样优雅,但仍然可以工作,并且不会创建目录中存在的所有文件名的数组

【讨论】:

【参考方案3】:

我不是 C# 程序员,所以可能会出现语法错误,但我认为它可以解决您的问题。

foreach (FileInfo fi in di.GetFiles("*.doc")
    .Where(fi => string.Compare(".doc", fi.Extension,  
StringComparison.OrdinalIgnoreCase) == 0))

 myFiles.Add(fi);

【讨论】:

可以使用string.Compare(".doc", fi.Extension, StringComparison.OrdinalIgnoreCase) == 0而不是String.Equals,它也需要一个参数来进行不区分大小写的比较。 String.Compare 主要用于确定字符串的顺序。

以上是关于如何使用 GetFiles() 搜索包含 doc 文件但排除 docx 文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Relay 和 graphql-dotnet 上传文件

System.IO.Path 不包含 GetFiles 的定义

WIN7中的Getfiles() UnAuthorizedAccessAcception

DirectoryInfo.GetFiles,如何在 C# 中获取不同类型的文件

Directory.GetFiles:如何只获取文件名,而不是完整路径? [复制]

c#如何获取某目录下的几种格式的图片文件。Directory.GetFiles