2016-03-07 74 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