c# - 递归是确定目录中最大文件大小的最佳选择吗

标签 c#

我编写了以下方法来确定最大文件大小:

    public static long GetMaxFileSize(string dirPath, long maxFileSize)
    {
        DirectoryInfo [] dirInfos = new DirectoryInfo(dirPath).GetDirectories();
        foreach (DirectoryInfo dirInfo in dirInfos)
        {
            DirectoryInfo [] subDirInfos = dirInfo.GetDirectories();
            foreach (DirectoryInfo subDirInfo in subDirInfos)
                maxFileSize = GetMaxFileSize(dirInfo.FullName, maxFileSize);

            FileInfo [] fileInfos = dirInfo.GetFiles();
            foreach (FileInfo fileInfo in fileInfos)
            {
                if (maxFileSize < fileInfo.Length)
                    maxFileSize = fileInfo.Length;
            }
        }

        return maxFileSize;
    }

Code Complete建议“有选择地使用递归”。既然如此,我想知道社区是否认为这是对递归的有效使用。如果没有,是否有更好的技术来做到这一点?

编辑: 我不能使用 LINQ,因为它在 .NET 2.0 中不可用,但我不想将其标记为 .NET 2.0 问题,只是为了进一步讨论如下 Jared 的问题.

编辑:根据未获取根目录文件时发现的问题清理了代码。

   public static long GetMaxFileSize(DirectoryInfo dirInfo, long maxFileSize)
   {
       DirectoryInfo [] subDirInfos = dirInfo.GetDirectories();
       foreach (DirectoryInfo subDirInfo in subDirInfos)
       {
           maxFileSize = GetMaxFileSize(subDirInfo, maxFileSize);
       }

       FileInfo [] fileInfos = dirInfo.GetFiles();
       foreach (FileInfo fileInfo in fileInfos)
       {
           if (maxFileSize < fileInfo.Length)
               maxFileSize = fileInfo.Length;
       }

       return maxFileSize;
   }

最佳答案

我认为更好的方法是让文件系统 API 通过 Directory.GetFiles 为您进行搜索。此方法提供子目录的自动搜索。这消除了是否递归的问题,而是将如何实现它的决定留给了 API 的设计者(他们可能是为这种情况设计的)。

这种方法结合LINQ提供了一个非常优雅的解决方案

var max = Directory
  .GetFiles(path, "*", SearchOption.AllDirectories)
  .Select(x => new FileInfo(x))
  .Select(x => x.Length)
  .Max();

编辑 正如 Jimmy 所指出的,对于 4.0 及更高版本,最好使用 EnumerateFiles 来避免创建潜在大数组的开销

var max = Directory
  .EnumerateFiles(path, "*", SearchOption.AllDirectories)
  .Select(x => new FileInfo(x))
  .Select(x => x.Length)
  .Max();

关于c# - 递归是确定目录中最大文件大小的最佳选择吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2065728/

相关文章:

c# - 从字符串中选择精确匹配的数字

c# - 仅更新客户端指定值的参数

c# - 失去焦点时如何保持 InputField 键盘打开?

c# - 如果可能,如何将对象转换到颜色

c# - 将服务引用添加到 SOAP 服务不会生成异步方法

c# - 将 VLC 播放器嵌入到 WPF 应用程序中

c# - 给定用户的 SID,我如何获得他们的 userPrincipalName?

c# - C# 的最佳解析器?

c# - C# 中的 "static method"是什么?

c# - 中央目录的偏移量不能保存在 Int64 中