繁体   English   中英

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

[英]“Illegal characters in path” error using wildcards with Directory.GetFiles

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

您在搜索模式中包含一个不期望的文件夹。 根据文件

searchPattern类型:System.String要与路径中的文件名匹配的搜索字符串。 此参数可以包含有效文字路径和通配符(*和?)字符的组合(请参阅“备注”),但不支持正则表达式。

考虑到这一点,尝试这样的事情:

String[] files = Directory.GetFiles(@"C:\Users\user", "test*.doc", SearchOption.AllDirectories)
                 .Where(file => file.Contains("\\Debug\\"))
                 .ToArray();

这将获取指定目录中的所有文件,并在路径中返回带有Debug的文件。 考虑到这一点,请尽量缩小搜索目录的范围。

注意:

我的原始答案包括EnumerateFiles ,它会像这样工作(确保传递搜索选项 (感谢@CodeCaster)):

String[] files = Directory.EnumerateFiles(@"C:\Users\user", "test*.doc", SearchOption.AllDirectories)
                 .Where(file => file.Contains("\\Debug\\"))
                 .ToArray();

我刚刚运行测试,第二个看起来比较慢,但是在较大的文件夹上可能会更快。 值得记住。

编辑:来自@pinkfloydx33注释

实际上,我实际上已经取消了我继承的系统。 尝试返回阵列并消耗内存占用需要花费很多时间。 问题转移到了无数的同行

因此,对于较大的目录,使用第二个选项会更安全。

第二个参数是搜索模式,仅适用于文件名。 因此,您需要迭代要搜索的目录,然后在每个目录上调用Directory.GetFiles(directory, "test*.doc")

如何编写代码取决于您希望它的强大程度以及您想要做出的假设(例如“所有Debug目录总是在用户目录中的两个级别”而不是“Debug目录可以在任何级别进入用户的目录” “ )。

请参阅如何递归列出C#中目录中的所有文件?

或者,如果要搜索所有子目录,然后丢弃与首选项不匹配的文件 ,请参阅以递归方式搜索目录中的文件

var files = Directory.GetFiles(@"C:\Users\user", "test*.doc", SearchOption.AllDirectories)
               .Where(f => f.IndexOf(@"\debug", StringComparison.OrdinalIgnoreCase) >= 0);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM