2017-02-12 74 views
0

尝试列出机器上的所有目录和文件并将它们分类为大小。 我得到一个文件名和它们的大小列表,但它不会坚持他们的顺序...任何建议非常感谢!干杯按大小顺序显示目录和文件c#

 //create instance of drive which contains files 
     DriveInfo di = new DriveInfo(@"C:\"); 
     //find the root directory path 
     DirectoryInfo dirInfo = di.RootDirectory; 

     try 
     { 

      //EnumerateFiles increases the performance and sort them 
      foreach (var fi in dirInfo.EnumerateFiles().OrderBy(f =>f.Length).ToList()) 
      { 
       try 
       { 

        //Display each file 
        Console.WriteLine("{0}\t\t{1}", fi.FullName, fi.Length); 

       } 
       catch (UnauthorizedAccessException UnAuthTop) 
       { 
        Console.WriteLine("{0}", UnAuthTop.Message); 
       } 
      } 
+0

除了'ToList'是不必要的(以及通过在枚举之前强制传递整个集合而损害性能)以及嵌套的'try-catch',不会看到会阻止收集进行排序的问题。它产生的输出是什么,它与你所期望的有什么不同? – Abion47

+0

我最初没有使用ToList方法,但它给出了相同的结果......它给我的文件的完整列表,但不是大小顺序......但与同一文件夹内的所有其他文件,所以他们是处理我认为 – user7553219

+0

该代码假定FileInfo.Length属性值不会更改。文件确实会改变它们的长度,当进程写入文件时发生。这对我来说可能是多么的不利,对FileInfo里面有一些缓存,排序时也很危险。 –

回答

0

你可以尝试这样的事情

// get your folder 
DirectoryInfo di = new DirectoryInfo(you path here); 

    // create a list of files from that folder 
    List<FileInfo> fi = di.GetFiles().ToList(); 

    // pass the files in a sorted order 
    var files = fi.Where(f => f.FullName != null).OrderByDescending(f => f.Length); 

在这个例子中:文件将包含一个列表,如果从当前文件夹级别,由file.length排序的文件。

您可能想要在将它传递给变量文件之前检查fi是否为空。然后,你可以用foreach迭代文件。

[更新]

正如@ Abion47指出,似乎没有成为欧普的代码和我的解决方案相差无几。从我在OP中读到的内容来看,OP没有得到一个排序列表,这是期望的结果。

我看到的可能会有所不同的是,通过使用EnumerateFiles,您可以在返回文件的整个集合之前开始枚举并可以处理文件信息。处理大量文件非常棒。并且,它比GetFiles更有效,可用于在单个文件可用时对其执行操作。

由于这种情况,您可能无法正确排序返回的文件,直到枚举完整的集合为止。

通过使用GetFiles,你必须等待它返回整个集合。让它更容易分类。

我不认为GetFiles是处理巨大集合的理想选择。在这种情况下,我会将工作分成几个步骤或采用其他方法。

+0

ToList是多余的。 – CSharpie

+0

@CSharpie也许你对ToList在这里是多余的权利,但是它满足了等号的两面,并且已经显示对几千个文件的处理没有显着的影响,这些文件几乎在瞬间显示。 – nocturns2

+0

为什么再次检查FullName为空? – Steve