"路径中的非法字符"使用带有Directory.GetFiles的通配符时出错

时间:2017-03-01 12:04:56

标签: c#

我有一个包含多个子目录的目录,其中包含.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"。

的一部分

2 个答案:

答案 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);

但请注意,这可能对性能有害,因为它会扫描不相关的目录。