我有一个包含多个子目录的目录,其中包含.doc文件。例如:
C:\Users\user\Documents\testenviroment\Released\test0.doc
C:\Users\user\Documents\testenviroment\Debug\test1.doc
C:\Users\user\Documents1\testenviroment\Debug\test2.doc
C:\Users\user\Documents1\testenviroment\Released\test20.doc
我想获取所有Debug文件夹下的所有test*.doc
文件。我试过了:
string[] files = Directory.GetFiles(@"C:\Users\user", "*Debug\\test*.doc",
SearchOption.AllDirectories);
它给了我一个"路径中的非法字符"错误。
如果我尝试:
string[] files = Directory.GetFiles(@"C:\Users\user", "\\Debug\\test*.doc",
SearchOption.AllDirectories);
我得到一个不同的错误:"找不到路径C:\ Users \ user \ Debug"。
的一部分答案 0 :(得分:13)
您在搜索模式中包含了一个不期望的文件夹。根据{{3}}:
searchPattern类型:System.String要匹配的搜索字符串 路径中文件的名称。此参数可以包含组合 有效的文字路径和通配符(*和?)字符(请参阅备注), 但不支持正则表达式。
考虑到这一点,尝试这样的事情:
String[] files = Directory.GetFiles(@"C:\Users\user", "test*.doc", SearchOption.AllDirectories)
.Where(file => file.Contains("\\Debug\\"))
.ToArray();
这将获取指定目录中的所有文件,并返回路径中包含Debug
的文件。考虑到这一点,请尽量缩小搜索目录范围。
注意:
我的原始答案包括docs,其效果如下(确保通过EnumerateFiles(感谢@CodeCaster)):
String[] files = Directory.EnumerateFiles(@"C:\Users\user", "test*.doc", SearchOption.AllDirectories)
.Where(file => file.Contains("\\Debug\\"))
.ToArray();
我刚刚运行测试,第二个似乎比较慢但是在较大的文件夹上可能会更快。值得记住。
编辑:来自@pinkfloydx33
实际上,我实际上已经取消了我拥有的系统 遗传。尝试返回阵列需要花费很多时间 也消除了内存占用。问题转移了 转到可以对付的同行
因此,对于较大的目录,使用第二个选项会更安全。
答案 1 :(得分:2)
第二个参数是搜索模式,仅适用于文件名。因此,您需要迭代要搜索的目录,然后在每个目录上调用Directory.GetFiles(directory, "test*.doc")
。
如何编写代码取决于您希望它的强大程度以及您想要做出的假设(例如"所有Debug目录始终是用户目录中的两个级别&#34 ; 与" Debug目录可以在任何级别进入用户的目录" )。
请参阅How to recursively list all the files in a directory in C#?。
或者,如果您要搜索所有子目录,然后丢弃与您的偏好不匹配的文件,请参阅Searching for file in directories recursively:
var files = Directory.GetFiles(@"C:\Users\user", "test*.doc", SearchOption.AllDirectories)
.Where(f => f.IndexOf(@"\debug", StringComparison.OrdinalIgnoreCase) >= 0);
但请注意,这可能对性能有害,因为它会扫描不相关的目录。