如何使用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;
}
**注**。 – MickyD
我不知道这一点,似乎是一个有用的信息要知道。谢谢! – Sach
你很受欢迎,好先生:) – MickyD