加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:44:25 所属栏目:百科 来源:网络整理
导读:我编写了以下方法来确定最大文件大小: public static long GetMaxFileSize(string dirPath,long maxFileSize) { DirectoryInfo [] dirInfos = new DirectoryInfo(dirPath).GetDirectories(); foreach (DirectoryInfo dirInfo in dirInfos) { DirectoryInfo
我编写了以下方法来确定最大文件大小:
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;
   }

解决方法

我认为更好的方法是使用File System 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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读