C# - 文件夹验证

C# - 文件夹验证

问题描述:

string excludeSubFolders = "SubFolderA, SubFolderB, SubFolderC, SubFolderABC"; 

DirectoryInfo directory = new DirectoryInfo(myRootFolderPath); 
DirectoryInfo[] directories = directory.GetDirectories(); 

    foreach (DirectoryInfo folder in directories) 
     if (folder.Name.ToString().Trim() != "SubFolderA") 
      {...} 

C#新手在这里。以上是我用来排除驻留在我的根文件夹(myRootFolderPath)中的“SubFolderA”的代码。我需要排除excludeSubFolders变量中列出的所有子文件夹。C# - 文件夹验证

谢谢

UPDATE:字符串excludeSubFolders正在通过参数填充的C#代码之外。我刚刚以c#预期的格式列出了该参数的输出。此外,该参数今天会有“SubFolderA,SubFolderB,SubFolderC,SubFolderABC”值,而后天,有人会将其更改为“SubFolderA,SubFolderB,SubFolderC”并调用相同的c#代码。这将如何与提出的字符串数组建议?

+1

关于您的更新,请参阅我的答案。 –

+0

谢谢MarcinJuraszek,Mo和Phil K的支持。我将Marcin的变种与Phil的foreeach结合起来,并且工作完美。我不得不选择一个,所以选择了最旧的答案(对莫和菲尔:))只是出于好奇,Marcin的变种对Mo/Phil的字符串[]有什么副作用? – 007

  1. 变化excludeSubFoldersstring[]数组:

    string[] excludeSubFolders = new [] { "SubFolderA", "SubFolderB", "SubFolderC", "SubFolderABC" }; 
    
  2. 使用Contains方法:

    foreach (DirectoryInfo folder in directories) 
        if (!excludeSubFolders.Contains(folder.Name)) 
         {...} 
    
  3. 要获得string[]从单一字符串中使用String.Split()方法:

    var subFolders = input.Split(',').Select(x => x.Trim()).ToArray(); 
    
+0

什么时候string数组有.Contains?我认为这是List吗? –

+0

@JohnOdom这是'IEnumerable '和'T []'实现'IEnumerable ''的扩展方法。 – MarcinJuraszek

+0

它添加了什么版本的.NET?我在这台电脑上使用.NET 2.0,我似乎无法找到它。 –

同马辛的,但这种改变字符串为您的阵列...

编辑:否定任何性能影响,我把斯普利特()退出循环(感谢马辛)

var excludeArray = excludeSubFolders.Split(new []{", "}, 
        StringSplitOptions.RemoveEmptyEntries); 
foreach (DirectoryInfo folder in directories) 
{ 
    if (!excludeArray.Contains(myRootFolderPath)) 
    { 
    ... 
    } 
} 
+0

它会在每次迭代时执行分割。 – MarcinJuraszek

+0

如果需要,可以将其内联,或者如果您担心性能,可将其分配给循环外的变量。这比回答说,这个问题是错误的:) –

+0

更新了OP。这似乎是一个很好的选择,因为它不需要改变变量类型......现在就测试它。 – 007

我首先要做的是改变你的excludeSubFolders到字符串数组,因为这使得它更容易的工作:

string[] excludeSubFolders = new string[] { "SubFolderA", "SubFolderB", "SubFolderC", "SubFolderABC" }; 

那么你可以使用LINQ筛选出符合您排除阵列,该目录:

foreach (DirectoryInfo folder in directories.Where(dir => !excludeSubFolders.Contains(dir.Name.ToString().Trim()))) 
{ 
    // ... 
} 

UPDATE:关于更新你的问题:如果你被交给一个逗号分隔的字符串和不能使用字符串数组,然后你可以将字符串拆分为一个字符串数组编程︰

string excludeSubFolders = "SubFolderA, SubFolderB, SubFolderC, SubFolderABC"; 
string[] excludeSubArray = excludeSubFolders.Split(new []{", "}, StringSplitOptions.RemoveEmptyEntries); 

foreach (DirectoryInfo folder in directories.Where(dir => !excludeSubArray.Contains(dir.Name.ToString().Trim()))) 
{ 
    // ... 
} 
+0

+1 for'Where()'代替'foreach ... if' –

+0

更新了OP。我怎么能仍然使用上面的逻辑(数组...)? – 007

+0

谢谢@Phil K的帮助。请阅读我对OP的回复。 :) – 007