如何使用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编号放在路径中。因此,基本上从路径开始,在每个文件夹上只搜索一个子文件夹名称,如果名称匹配,则计算该文件夹中的所有文件,并将其累积。