如何使用C#计算具有特定名称的子文件夹中的文件数量?

问题描述:

我有一个路径结构如下所示:如何使用C#计算具有特定名称的子文件夹中的文件数量?

Main_Folder 
     ***Sub_Folder1*** 
      **1) FOLDER_Y** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
       FolderN 
        picture1.png 
        picture2.png 
        picturen.png 
      **2) FOLDER_X** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
      **3) FOLDER_Z** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
    ***Sub_Folder2*** 
      **1) FOLDER_Y** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
       FolderN 
        picture1.png 
        picture2.png 
        picturen.png 
      **2) FOLDER_X** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
      **3) FOLDER_Z** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
    ***Sub_Folder3*** 
      **1) FOLDER_Y** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
       FolderN 
        picture1.png 
        picture2.png 
        picturen.png 
      **2) FOLDER_X** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
      **3) FOLDER_Z** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
> Desired mock output: 
> FOLDER_Y # files: 27 
> FOLDER_X # files: 18 
> FOLDER_Z # files: 18 

我基本上希望用户输入主文件夹的路径,然后在每个迭代sub_folder。然后从所有子文件夹中输出所有Folder_Y中的文件总数。 Folder_X,Folder_Z也是一样。

我试过几种方法不成功。

public void getFOLDER_Y(string strPath) 
{ 
    string partialName = "FOLDER_Y"; 

    DirectoryInfo hdDirectoryInWhichToSearch = new DirectoryInfo(strPath); 
    FileInfo[] filesInDir = hdDirectoryInWhichToSearch.GetFiles("*" + partialName + "*.*"); 
    DirectoryInfo[] dirsInDir = hdDirectoryInWhichToSearch.GetDirectories("*" + partialName + "*.*"); 

    foreach (FileInfo foundFile in filesInDir) 
    { 
     string fullName = foundFile.FullName; 
     richtxt_results.Text += fullName + "\n"; 

    } 

    foreach (DirectoryInfo foundDir in dirsInDir) 
    { 
     string fullName = foundDir.FullName; 
     richtxt_results.Text += fullName + "\n"; 
    } 
} 

public static void CountFiles(string path) 
    { 
     int xFileCount = 0; 
     int yFileCount = 0; 
     int zFileCount = 0; 

     var files = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories); 

     foreach(string file in files) 
     { 
      string folder = new DirectoryInfo(Path.GetDirectoryName(file)).Name; 
      if (folder == "FOLDER_X") 
       xFileCount++; 
      if (folder == "FOLDER_Y") 
       yFileCount++; 
      if (folder == "FOLDER_Z") 
       zFileCount++; 
     } 

     Console.WriteLine("X Files : {0}", xFileCount); 
     Console.WriteLine("Y Files : {0}", yFileCount); 
     Console.WriteLine("Z Files : {0}", zFileCount); 
    } 

一些提示:

  • 如果您想搜索特定类型的文件(比如说,例如,仅文本文件),那么你可以传递给Directory.GetFiles搜索模式(),如“.txt”而不是“。*”。
  • 如果你想让这个更通用,而不是硬编码你的文件夹名称,你可以将它作为参数传递。

所以,我真的会使用此功能,并与你想要的任何文件夹名称称呼它:

public static int CountFiles(string path, string folderToSearch) 
    { 
     int fileCount = 0; 

     var files = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories); 

     foreach (string file in files) 
     { 
      string folder = new DirectoryInfo(Path.GetDirectoryName(file)).Name; 
      if (folder == folderToSearch) 
       fileCount++; 
     } 

     return fileCount; 
    } 

然后调用它像这样:

static void Main(string[] args) 
    { 
     int xFiles = CountFiles("path goes here", "FOLDER_X"); 
     int yFiles = CountFiles("path goes here", "FOLDER_Y"); 
     int zFiles = CountFiles("path goes here", "FOLDER_Z"); 
    } 

编辑:做了小改动到如何获得直接目录名称。

EDIT2:编辑合并@MickyD的建议。

编辑3:这将通过您最近的要求。有大量文件打交道时,特别是与子文件夹,因为它返回一个**的IEnumerable <> **,而不是一个数组,你应该使用** ** EnumerateFiles -

public static int CountFiles2(string path, string folderToSearch) 
    { 
     int fileCount = 0; 
     var dirs = Directory.EnumerateDirectories(path, folderToSearch, SearchOption.AllDirectories).ToList(); 

     foreach (string dir in dirs) 
     { 
      var files = Directory.EnumerateFiles(dir, "*.*", SearchOption.AllDirectories); 
      if (files != null) 
       fileCount += files.Count(); 
     } 

     return fileCount; 
    } 
+2

**注**。 – MickyD

+0

我不知道这一点,似乎是一个有用的信息要知道。谢谢! – Sach

+0

你很受欢迎,好先生:) – MickyD