2016-03-07 64 views
1

我正在編寫代碼以從名稱爲「1」,「2」,「3」,「4」等的輸出文件夾中獲取子目錄(即sub只有數名目錄)如何使用GetDirectories搜索數字目錄名稱C#

例如: 這是我的輸出文件夾:C:\用戶\某某\桌面\輸出

我想子目錄與名稱

「1 「,」2「,」3「,」4「

輸出:

C:\用戶\ XYZ \桌面\輸出\ A \ A1 \ 1
C:\用戶\ XYZ \桌面\輸出\ A \ A1 \ 2
C:\ Users \ xyz \ Desktop \ Output \ A \ A1 \ 3
C:\ Users \ xyz \ Desktop \ Output \ A \ A1 \ 4
C:\ Users \ xyz \ Desktop \ Output \ A \ A2 \ 1
C:\ Users \ xyz \ Desktop \ Output \ A \ A2 \ 2

在我的代碼中,我嘗試使用搜索模式,但無法找到所需的輸出:

這裏是片段,它可以獲取所有名稱爲「1」

string[] destDir1 = Directory.GetDirectories(
    destinationFolderPath, 
    "1", 
    SearchOption.AllDirectories); 

的子目錄因此,爲了獲得所有與名稱爲「1」的目錄, 「2」,「3」和「4」我使用方括號的通配符如下,這是行不通的。

string[] destDir1 = Directory.GetDirectories(
    destinationFolderPath, 
    "[0-9]", 
    SearchOption.AllDirectories); 

我跟着msdn link以獲取搜索模式更多的選擇通配符

有什麼不對這個邏輯?

+0

https://msdn.microsoft.com/en-us/library/ms143325%28v=vs。 110%29.aspx 正則表達式不支持! – Alex

+0

'[0-9]'通配符不適用於GetDirectories。據我所知,只支持'?'和'*'。你應該得到所有的目錄然後過濾它們 – Pikoh

+0

'int tempVar = 0;字符串[] dirs = Directory.GetDirectories(destinationFolderPath).Where(dir => int.TryParse(dir,out tempVar));' – Blablablaster

回答

1

用正則表達式,你可以這樣做:

List<string> destDir1 = Directory.GetDirectories(folderPath, "*", 
    SearchOption.AllDirectories) 
     .Where(f => Regex.IsMatch(f, @"[\\/]\d+$")).ToList(); 

[\/]\d+$匹配一個文件夾中有/或\([\\/])通過在一端或更多(+)數字(\d)跟隨($ )。

上面的代碼返回List<string>,每串有最後一部分是一個數字,即:D:\folder\1234,但不匹配D:\folder\aaa111


要包含有一部分是內部號(末尾不是必要的)的所有文件夾,即 D:\1\folder,使用下面的代碼:

List<string> destDir1 = Directory.GetDirectories(folderPath, "*", 
    SearchOption.AllDirectories) 
     .Where(f => Regex.IsMatch(f, @"[\\/]\d+[\\/$]")).ToList(); 

它將匹配文件夾一樣D:\1234\childD:\child\1234,但不匹配D:\aaa111\child

+0

櫻花:完美,完全按照我的想法工作。感謝 – marak

+0

@marak歡迎:) – Sakura

0

您發佈的msdn鏈接是用於Visual Studio中的搜索模式(您在代碼文件中搜索時使用的那些)。

不支持(正常DOS)*?GetDirectories)以外的(正則表達式)搜索模式或通配符。

因此,您可能必須枚舉所有目錄並在代碼中檢查其名稱。

MDSN about GetDirectories

是searchPattern可以是文字和通配符的組合,但不支持正則表達式。 searchPattern中允許使用以下通配符說明符。

...

*(星號)該位置的零個或多個字符。

? (問號)該位置上的零個或一個字符。

1

你應該這樣做mething這樣的(因爲GetDirectories不支持正則表達式):

DirectoryInfo dInfo = new DirectoryInfo(@"C:\Test"); 
var allDirs = dInfo.GetDirectories(); 
var matchingDirs = allDirs.Where(info => Regex.Match(info.Name, "[0-9]", RegexOptions.Compiled).Success); 

enter image description here

​​

+0

昆汀羅傑,我嘗試了你的邏輯,但它獲得的文件夾名稱與「1」,「2」以及「A1」,「A2」等...我不要在我的輸出。我相信小的tweeking將有助於獲得輸出,但現在使用其他解決方案。 – marak

+0

我認爲所有的正則表達式都需要錨定到字​​符串的開始和結尾,即'^ [0-9] $' – TheLethalCoder