You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#新手求助:实现目录大小计算功能相关问题

完善C#目录大小计算方法的步骤

嘿,作为C#新手能写出这个基础框架已经很赞了!咱们一步步把这个CalculateSize方法完善,让它能准确计算目录的总大小:

1. 累加当前目录的文件大小

你现在已经获取了当前目录的文件数组,但还没把文件大小累加到结果里。记得要先判断files不为null(因为捕获异常时files不会被赋值),再循环累加每个文件的Length

if (files != null)
{
    foreach (FileInfo file in files)
    {
        result += file.Length;
    }
}

2. 递归遍历子目录并累加大小

目录总大小肯定包含所有子目录的大小,所以要获取子目录数组,然后递归调用CalculateSize方法,把每个子目录的大小加进来。同样要处理子目录的访问异常:

try
{
    subDirs = dir.GetDirectories();
    foreach (DirectoryInfo subDir in subDirs)
    {
        result += CalculateSize(subDir, search);
    }
}
catch (UnauthorizedAccessException)
{
    // 记录无法访问的子目录,方便调试
    Console.WriteLine($"无法访问子目录: {dir.FullName}");
}
catch (PathTooLongException e)
{
    Console.WriteLine($"路径过长异常: {e.Message},路径: {dir.FullName}");
}

3. 完善异常处理与边界检查

  • 先添加对传入dirnull的判断,避免空引用异常:
    if (dir == null) return 0;
    
  • 补充其他可能的异常类型,比如DirectoryNotFoundException,同时让异常信息更清晰,方便后续排查问题。

完整的完善后代码

public static long CalculateSize(DirectoryInfo dir, string search = "*.*")
{
    // 边界检查:传入目录为null直接返回0
    if (dir == null) return 0;

    long result = 0;
    FileInfo[] files = null;
    DirectoryInfo[] subDirs = null;

    try
    {
        files = dir.GetFiles(search, SearchOption.TopDirectoryOnly);
    }
    catch (UnauthorizedAccessException)
    {
        Console.WriteLine($"无法访问目录下的文件: {dir.FullName}");
    }
    catch (PathTooLongException e)
    {
        Console.WriteLine($"路径过长异常: {e.Message},路径: {dir.FullName}");
    }
    catch (DirectoryNotFoundException)
    {
        Console.WriteLine($"目录不存在: {dir.FullName}");
    }

    // 累加当前目录的文件大小
    if (files != null)
    {
        foreach (FileInfo file in files)
        {
            result += file.Length;
        }
    }

    // 处理子目录
    try
    {
        subDirs = dir.GetDirectories();
        foreach (DirectoryInfo subDir in subDirs)
        {
            // 递归计算子目录大小并累加
            result += CalculateSize(subDir, search);
        }
    }
    catch (UnauthorizedAccessException e)
    {
        Console.WriteLine($"无法访问子目录: {dir.FullName},异常信息: {e.Message}");
    }
    catch (PathTooLongException e)
    {
        Console.WriteLine($"子目录路径过长: {dir.FullName},异常信息: {e.Message}");
    }

    return result;
}

额外小提示

  • 如果目录非常大,递归可能会导致栈溢出,这时可以考虑用**迭代(循环)**的方式替代递归,比如用Stack<DirectoryInfo>来存储待处理的目录。
  • 可以添加一个参数控制是否跳过无法访问的目录,让方法更灵活。

内容的提问来源于stack exchange,提问作者Petar Stoyanov

火山引擎 最新活动