如何获取指定目录的DirectoryInfo与FileInfo并生成CSV统计文件?
整合代码实现I盘目录统计并写入CSV
我需要完成一项练习任务:将I盘下所有一级目录的路径、包含子文件夹的文件总数、目录大小信息写入CSV文件。目前已写出两段分别实现单独功能的代码,但不清楚如何整合,也不确定是否有更优实现方式。
原有功能代码
- 获取I盘所有一级目录路径的代码:
static void Main(string[] args) { string importPath = @"I:\"; foreach (string directory in Directory.EnumerateDirectories(importPath, "*.*", SearchOption.TopDirectoryOnly)) { Console.WriteLine(directory); } Console.ReadLine(); }
- 获取单个目录统计信息的代码:
static void Main(string[] args) { string importPath = @"I:\"; DirectoryInfo dInfo = new DirectoryInfo(importPath); double sizeOfDir = DirectorySize(dInfo, true); DirectoryInfo d = new DirectoryInfo(importPath); FileInfo[] f = d.GetFiles("*", SearchOption.AllDirectories); System.Console.WriteLine(dInfo.FullName + "; " + f.Length.ToString() + "; " + string.Format("{0:0.00}", ((double)sizeOfDir) / (1024 * 1024 * 1024)) + "GB"); System.Console.ReadLine(); } private static double DirectorySize(DirectoryInfo dInfo, bool includeSubDir) { double totalSize = dInfo.EnumerateFiles() .Sum(file => file.Length); if (includeSubDir) { totalSize += dInfo.EnumerateDirectories() .Sum(dir => DirectorySize(dir, true)); } return totalSize; }
整合后的完整代码
将遍历目录与统计逻辑结合,同时实现CSV写入功能:
using System; using System.IO; using System.Linq; class DirectoryStats { static void Main(string[] args) { string rootPath = @"I:\"; string outputCsvPath = @"I:\DirectoryStats.csv"; // 创建或覆盖CSV文件 using (StreamWriter writer = new StreamWriter(outputCsvPath, false)) { // 写入表头(可选) writer.WriteLine("目录路径;文件总数;目录大小(GB)"); // 遍历I盘下所有一级目录 foreach (string dirPath in Directory.EnumerateDirectories(rootPath, "*", SearchOption.TopDirectoryOnly)) { DirectoryInfo dirInfo = new DirectoryInfo(dirPath); // 获取包含子文件夹的文件总数 int fileCount = dirInfo.GetFiles("*", SearchOption.AllDirectories).Length; // 计算目录总大小(字节)并转换为GB double dirSizeBytes = DirectorySize(dirInfo, true); double dirSizeGB = dirSizeBytes / (1024 * 1024 * 1024); string sizeFormatted = string.Format("{0:0.00}", dirSizeGB) + "GB"; // 写入CSV行 string line = $"{dirInfo.FullName};{fileCount};{sizeFormatted}"; writer.WriteLine(line); // 同时输出到控制台查看进度 Console.WriteLine(line); } } Console.WriteLine("统计完成,结果已写入CSV文件"); Console.ReadLine(); } // 递归计算目录大小的方法 private static double DirectorySize(DirectoryInfo dInfo, bool includeSubDir) { double totalSize = dInfo.EnumerateFiles().Sum(file => file.Length); if (includeSubDir) { totalSize += dInfo.EnumerateDirectories().Sum(dir => DirectorySize(dir, true)); } return totalSize; } }
关键说明
- 遍历逻辑:使用
Directory.EnumerateDirectories获取I盘根目录下的所有一级目录,避免一次性加载所有目录信息到内存 - 统计逻辑:对每个目录,调用
GetFiles并指定SearchOption.AllDirectories获取所有文件数量;复用原有递归方法计算目录总大小 - CSV写入:使用
StreamWriter逐行写入,确保大文件场景下的内存效率;可选写入表头提升CSV可读性 - 格式输出:将字节大小转换为保留两位小数的GB格式,与预期输出格式一致
预期输出示例
I:\Scanner; 1543; 100.00GB I:\Printer; 296; 22.00GB I:\SysDeploy; 935; 66.00GB I:\Intern; 4256; 30.00GB
内容的提问来源于stack exchange,提问作者BavoVc
相关产品推荐
相关产品推荐

