【问题标题】:Largest File in Directory目录中最大的文件
【发布时间】:2014-12-27 21:23:56
【问题描述】:

我们被分配了一项任务,从目录中读取信息。我正在努力寻找价值最大的文件。这个我试过了;

using System.IO; 

static void Main(string[] args)
{
    DirectoryInfo folderInfo = new DirectoryInfo("path");
    FileInfo[] files = folderInfo.GetFiles();

    int largestSize;

    for (largestSize = 0; largestSize < files.Length; largestSize++)
    {
        Console.WriteLine(files[largestSize].Length);
    }

    Console.ReadLine();
}

但这不起作用。当我说它不起作用时,我的意思是它在列表中显示目录中所有文件的文件大小。我完全糊涂了,因为这正是我的导师建议的。 “为从 0 开始的最大文件创建一个变量并遍历文件以查找最大大小”。

我怀疑我可以使用或理解 Foreach 循环,因为到目前为止我只学习了 For、do-while、while、if 和 if else 语句。

【问题讨论】:

  • 我认为你需要花更多的时间来理解代码中的每个语句和构造实际上在做什么,而不是将代码视为将执行特定任务的不透明魔法。跨度>
  • 这里是您发布的代码中发生的事情的逐个播放。您实例化一个FolderInfo 对象(它表示一个文件夹,并公开允许您获取有关该文件夹及其内容的更多信息的成员)。您可以使用此实例获取FileInfo 对象的数组,这些对象同样表示文件。然后,您使用名为largestSize 的计数器(这可能是您出错的地方)遍历文件数组,并且对于每个FileInfo,您将Length 属性的值写入控制台。最后,等待用户按回车键。
  • 我是初学者,绝对的初学者。这是我的第一个编程语言,在我几乎不了解 VB 编码之前。我将通过并尝试了解我在做什么。

标签: c#


【解决方案1】:

你可以用这个:

long largestSize = 0;
for (int i = 0; i < files.Length; i++)
{
    if (files[i].Length > largestSize)
         largestSize = files[i].Length;
}
Console.WriteLine(largestSize);

【讨论】:

  • 对不起,我的错误 - 我已经修复了它
  • @Domestos99 非常感谢,我之前使用过类似的代码,但我错了,因为不是 largeSize = files[i].Length;我写了这个 maximumSize+= files[i].Length;
  • @Domestos99 为了显示名称我尝试了 files[largestSize].Name 和 files[i].Name 但都没有显示最大文件的名称......我在这里做错了吗?跨度>
  • @FarhaAbdul 您不能使用文件大小作为索引,我也错了。我会使用下一个变量作为最大文件的索引。
  • @Domestos99 我知道我很慢很抱歉,但我不明白?我的理解是,使用 i 和 maximumSize 不能用作索引我不明白并且无法弄清楚最大文件的下一个变量是什么。
【解决方案2】:

这会按大小降序对文件进行排序

new DirectoryInfo(path).EnumerateFiles()
                       .OrderByDescending(f => f.Length)
                       .FirstOrDefault();

并且将返回最大的文件,如果目录不包含文件,则返回 null。

【讨论】:

  • 不知道为什么你会得到这么多的反对票,但你可能想使用Max 而不是OrderByFirstOrDefault,因为没有必要对目录中的每个文件进行排序大小。
  • 那么他有新东西要学。这种“哦学习的东西”真的很无聊。在EVERY 函数式编程语言中,使用 LINQ 进行这样的编码绝对是正常的和初学者的东西。没有一个理由不学习这些东西,也不是作为初学者。
  • @Sid:我倾向于同意!为什么要搞乱不可读的循环,无论如何您稍后都会跳过并且不学习不难理解的函数式 LINQ。反之亦然,它易于使用且易于阅读。
  • @SidBurn 但是为了节省一些击键而执行额外的工作并增加代码的时间复杂度并不是您应该设置新手的路径。事情应该尽可能地方便,但不是更方便。如果您真的喜欢 LINQ 的表现力,请添加一个可枚举的扩展方法,如 MaxBy 或使用正确算法找到最大项目并返回它的东西。然后使用 that 在你的简短,好看的代码中。
  • @abatishchev 这不是过早的优化。我们不是在这里微调程序以节省时间,我们正在谈论消除数量级的完全无用的活动。这是一个使用正确算法的案例,当整个重点是学习如何以编程方式解决问题时。当你需要一把螺丝刀时,拔出 LINQ 锤子是个坏主意,即使 LINQ 是一把非常好的锤子。
【解决方案3】:

.Net 4(或 .Net 3.5 中的 GetFiles):

long maxSize = new DirectoryInfo("path").EnumerateFiles().Max(f => f.Length);

对于更多文件,PLINQ 可用于小幅加速:

long maxSize = new DirectoryInfo("path").EnumerateFiles().AsParallel().Max(f => f.Length);

【讨论】:

    【解决方案4】:
       DirectoryInfo folderInfo = new DirectoryInfo(@"C:\test");
            FileInfo[] files = folderInfo.GetFiles();
    
            long[] sort = new long[files.Length];
    
    
            for (int largestSize = 0; largestSize < files.Length; largestSize++)
            {
                int index = 0;
                for (int largestSize2 = 0; largestSize2 < files.Length; largestSize2++)
    
                {
                    if (files[largestSize].Length < files[largestSize2].Length)
                    {
                        index++;
                    }
    
                }  
                sort[index] = files[largestSize].Length;
    
            }
    
    
            for (int i = 0; i < sort.Length; i++)
            {
                Console.WriteLine(sort[i]);
            }
            Console.ReadLine();
    

    我尝试了最简单的方法,我可以让你理解,首先我循环文件并为所有元素创建第二个循环,我在值之间进行比较,并根据比较顺序在数组中对它们进行排序,以比较希望你在寻找什么当然,对文件进行排序取决于大小而不是最大的最大总是排序[0]

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 2012-01-04
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2017-08-21
      相关资源
      最近更新 更多