2015-03-03 104 views
0

任何人都可以澄清我的疑惑吗?是否可以在单一条件下检查给定路径中是​​否存在多个扩展文件?

场景:我想检查一个条件下给定路径中存在多个扩展文件。

DirectoryInfo projectInfo = new DirectoryInfo(projectPath); 
string projectFileType = "*.vbproj,*.csproj,*.master,*.aspx"; 
if (projectFileType != string.Empty) 
{ 
    FileInfo[] projFiles = projectInfo.GetFiles(projectFileType, SearchOption.AllDirectories); 
} 

在此先感谢!

+1

可能重复http://stackoverflow.com/questions/14961437/directoryinfo-getfiles-how-to-get-different-types -of-files-in-c-sharp) – 2015-03-03 07:50:58

+0

你会发现这个问题已经被问过很多次了。重复的问题包含回答和更多指向以前类似问题的指针。总之,要么连接每个搜索的结果,要么列举所有检查扩展名的文件与扩展名列表 – 2015-03-03 07:52:22

回答

0

您的代码将无法使用。 GetFiles只需要一个文件扩展名。这是GetFiles方法的限制。解决方案是编写自己的代码。

您可以使用此代码:

var filteredFiles = Directory 
        .EnumerateFiles(path) 
        .Where(file => file.ToLower().EndsWith("aspx") || file.ToLower().EndsWith("vbproj") || file.ToLower().EndsWith("csproj") || file.ToLower().EndsWith("master")) 
        .ToList(); 
FileInfo[] projFiles = filteredFiles.ToArray(); 

编辑:一种更有效的方式来做到这一点,通过在注释中Panagiotis Kanavos的建议,是显示如下:

string supportedExtensions = "*.aspx,*.vbproj,*.csproj,*.master"; 
FileInfo[] projFiles = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories) 
.Where(s => supportedExtensions.Contains(s.Extension.ToLower())).ToArray(); 
+0

这是一个非常糟糕的主意 - 枚举所有文件,而不是具有特定扩展名的文件。这会浪费很多时间*和*可能会返回错误的结果 - 只有当文件以字符串结尾时,代码才会检查实际的扩展名 – 2015-03-03 07:48:08

+0

您可以提供更好的解决方案吗? – 2015-03-03 08:00:45

+0

使用FileInfo的Extension属性。连接搜索结果。使用不区分大小写比较的扩展名列表。这个问题已经被多次解答。重复包含所有这些技术。 – 2015-03-03 08:06:58

0

你的问题不清楚。我假设您正在检查类型为“.vbproj, .csproj,.master, .aspx”的文件的存在情况。为此,您可以使用下面的代码。

 bool IsAllFilesAvailable(string directoryPath) 
     { 
      var filteredFiles = Directory 
        .EnumerateFiles(directoryPath) 
        .Where(file => file.ToLower().EndsWith("aspx") || file.ToLower().EndsWith("vbproj") || file.ToLower().EndsWith("csproj") || file.ToLower().EndsWith("master")) 
        .ToList();    

      if (filteredFiles.Count == 4) 
       return true; 
      else 
       return false; 
     } 
+0

这是一个非常糟糕的主意 - 枚举所有文件,而不是具有特定扩展名的文件。这会浪费很多时间*和*可能返回错误的结果 - 代码不会检查实际的扩展名,只有当文件以字符串结尾时 – 2015-03-03 07:48:26

0

我们可以使用下面的代码作为解决方案。

FileInfo[] fi = new string[]{"*.csproj", "*.vbproj", "*.master", "*.aspx", "*.config", "*.ascx", "*.resx"} 
     .SelectMany(i => di.GetFiles(i, SearchOption.AllDirectories)) 
     .Distinct().ToArray(); 
[DirectoryInfo.GetFiles,如何获得不同类型的文件在C#(的
相关问题