[英]“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.