簡體   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