如何使用 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,当然,后面的比较是在字符串值上执行的,现在你可以得到一个扩展名DOC
或doc
(不同的大小写),StringComparison
参数正在做与忽略大小写比较,因此 DOC
和 doc
将被视为相同【参考方案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# 中获取不同类型的文件