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

如何使用C#计算具有特定名称的子文件夹中的文件数?,c#,directory,C#,Directory,我的路径结构如下所示: Main_Folder ***Sub_Folder1*** **1) FOLDER_Y** Folder1 picture1.png picture2.png picturen.png Folder2 picture1.p

我的路径结构如下所示:

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
我基本上希望用户输入主文件夹的路径,然后遍历每个子文件夹。然后从所有子文件夹中输出所有文件夹中的文件总数。文件夹X和文件夹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";
    }
}
几点提示:

  • 如果要搜索特定类型的文件(例如,仅文本文件),则可以将搜索模式传递给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");
    }
编辑:对获取直接目录名的方式做了一个小更改

编辑2:编辑以纳入@MickyD的建议

EDIT3:这将通过您最近的要求

    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;
    }
几点提示:

  • 如果要搜索特定类型的文件(例如,仅文本文件),则可以将搜索模式传递给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");
    }
编辑:对获取直接目录名的方式做了一个小更改

编辑2:编辑以纳入@MickyD的建议

EDIT3:这将通过您最近的要求

    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;
    }

注意-在处理大量文件时,尤其是处理子文件夹时,应该使用EnumerateFiles,因为它返回的是IEnumerable而不是数组。我不知道这一点,而且这似乎是一条有用的信息。谢谢感谢您抽出时间回答。但是,我在stringfolder=newdirectoryinfo(Path.GetDirectoryName(file)).Name;它以某种方式搜索我的C#项目所在目录中的文件夹,而不是路径。即使我使用适当的路径调用函数。@AR.Torres您是否传递了正确的路径来代替“路径转到此处”?我建议你使用我测试过的第二种方法。请仔细检查。你犯了什么错误?这是非常值得怀疑的,因为如果你进入
foreach
循环,那就意味着你已经在任何地方找到了文件。是的,路径有问题,所以现在已经解决了。但是我忘了提到文件夹还有其他文件夹,我想知道这些文件夹的数量,所以现在你的代码输出0。假设FOLDER_X有20个文件夹,在每个X编号的文件中,如果有意义的话,我会尝试将每个名为FOLDER_X的文件夹的组合X编号放在路径中。因此,基本上从路径开始,在每个文件夹上只搜索一个子文件夹的名称,如果匹配,则计算该文件夹中的所有文件并将其累积。注意-在处理大量文件时,尤其是处理子文件夹时,应使用EnumerateFiles,因为它返回的是IEnumerable,而不是数组。我不知道这一点,而且这似乎是一条有用的信息。谢谢感谢您抽出时间回答。但是,我在stringfolder=newdirectoryinfo(Path.GetDirectoryName(file)).Name;它以某种方式搜索我的C#项目所在目录中的文件夹,而不是路径。即使我使用适当的路径调用函数。@AR.Torres您是否传递了正确的路径来代替“路径转到此处”?我建议你使用我测试过的第二种方法。请仔细检查。你犯了什么错误?这是非常值得怀疑的,因为如果你进入
foreach
循环,那就意味着你已经在任何地方找到了文件。是的,路径有问题,所以现在已经解决了。但是我忘了提到文件夹还有其他文件夹,我想知道这些文件夹的数量,所以现在你的代码输出0。假设FOLDER_X有20个文件夹,在每个X编号的文件中,如果有意义的话,我会尝试将每个名为FOLDER_X的文件夹的组合X编号放在路径中。因此,基本上从路径开始,在每个文件夹上只搜索一个子文件夹名称,如果名称匹配,则计算该文件夹中的所有文件,并将其累积。