You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取指定目录的DirectoryInfo与FileInfo并生成CSV统计文件?

整合代码实现I盘目录统计并写入CSV

我需要完成一项练习任务:将I盘下所有一级目录的路径、包含子文件夹的文件总数、目录大小信息写入CSV文件。目前已写出两段分别实现单独功能的代码,但不清楚如何整合,也不确定是否有更优实现方式。

原有功能代码

  1. 获取I盘所有一级目录路径的代码:
static void Main(string[] args)
{
    string importPath = @"I:\";

    foreach (string directory in Directory.EnumerateDirectories(importPath, "*.*", SearchOption.TopDirectoryOnly))
    {
        Console.WriteLine(directory);
    }
    
    Console.ReadLine();
}
  1. 获取单个目录统计信息的代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:10:33