2017-02-12 2 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

Yeh私はもともと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がnullでないかどうかを確認したい場合があります。その後、foreachを使用してファイルを反復処理できます。 @ Abion47が指摘するように

[UPDATE]

、オペアンプのコードと私の溶液との間に大きな違いがあるようには思えません。私がOPで読んだことから、OPはソートされたリストを得ていない。これは望ましい結果である。

違いが見られるのは、EnumerateFilesを使用することで列挙が開始され、ファイルのコレクション全体が返される前にファイル情報に作用することができることです。膨大な量のファイルを処理するのに最適です。また、GetFilesよりも効率的です。個々のファイルが利用可能になった時点で操作を実行します。

完全なコレクションが列挙されるまで、返されたファイルを適切に並べ替えることができない場合があります。

GetFilesを使用すると、コレクション全体を返すまで待つ必要があります。並べ替えが容易になります。

GetFilesは巨大なコレクションを処理するのには理想的ではないと思います。その場合、私は作業をステップに分けたり、他のアプローチをとったりします。

+0

ToListは冗長です。 – CSharpie

+0

@CSharpieおそらくToListについてのあなたの権利はここでは冗長ですが、等号の両側を満たし、何千というファイルで作業することに大きな影響を与えませんでした。 – nocturns2

+0

FullNameがnullであることを再度チェックする理由は何ですか? – Steve

関連する問題