2009-06-28 13 views
4

ディレクトリとサブフォルダを列挙して列挙のすべてのファイルを集めるより高速な方法を知っている人はいますか?これは今私が持っているものです:すぐにサブフォルダを含むすべてのファイルを列挙する

Public Shared allFiles() As String 
allFiles = Directory.GetFiles(<ServerLocation>, "*.*", SearchOption.AllDirectories) 

ありがとう! JFV

EDIT:サーバーの場所からこれらのファイルを列挙しています。それがこの質問の見方を変えるかどうかはわかりません。これまでのすべての入力をありがとう!

答えて

4

短い答え:

このコードは、プロジェクトのために機能的に正しく、あなたはそれがプロファイラに問題があることが証明されていない、それを変更しない場合。あなたがそれが遅いことを証明するまで、機能的に正しいソリューションを使用し続けます。

長い答え:要因の多くに依存しているどのくらいの速さや、コードのこの特定の部分を遅らせる

。その多くは、実行中の特定のマシン(ハードドライブの速度など)に依存します。ファイルシステムとそれ以外のものを含むコードを見ると、「xはyより速い」と言うのは非常に難しいです。

この場合、私は本当に1つのことについてコメントすることができます。このメソッドの戻り値の型は、FileInfo値の配列です。配列は連続したメモリを必要とし、非常に大きな配列はヒープに断片化の問題を引き起こす可能性があります。 大きなディレクトリを読んでいると、ヒープの断片化や間接的なパフォーマンスの問題が発生する可能性があります。

これが問題になる場合は、FindFirstFile/FindNextFileにPInvokeして一度に1つずつ取得できます。結果は、CPUサイクルで機能的に遅くなる可能性がありますが、メモリの負荷がより少なくなります。

しかし、私はあなたがを修正する前に問題があることを証明する必要があることを強調しなければなりません。

+0

+1私は –

+0

しかし同時に、.NETで大規模なディレクトリ内のすべてのファイルを一覧表示しようとしたことのある人は、それがパフォーマンス上の問題であることを知っている可能性がより。リスト1000のフォルダ名は、ちょうどフルネームの名前を取ることができます。 –

0

これはやっかいなことです。

dir /s /b 

\r\nによってそれを&分割を読んで、テキストファイルにこの出力を取得します。
上記のコマンドを特定のディレクトリで実行して、それが役立つかどうかを確認します。

しか取得のみファイルへ

dir /s /b /a-d 

EDITをディレクトリ

dir /s /b /ad 

を取得するには:ジャレッドは右のあなたのアプローチが遅い証明されない限り、他のアプローチを使用しないように言ってで。

+1

dirの呼び出しと出力の読み取りがDirectory.GetFiles呼び出しより高速であると思われる理由を明確にしてください。 – Marek

3

using System.Collections.Generic;元の記事へ

private static List<string> GetFilesRecursive(string b) 
{ 

      // 1. 
      // Store results in the file results list. 
      List<string> result = new List<string>(); 

      // 2. 
      // Store a stack of our directories. 
      Stack<string> stack = new Stack<string>(); 

      // 3. 
      // Add initial directory. 
      stack.Push(b); 

      // 4. 
      // Continue while there are directories to process 
      while (stack.Count > 0) 
      { 
       // A. 
       // Get top directory 
       string dir = stack.Pop(); 

       try 
       { 
        // B 
        // Add all files at this directory to the result List. 
        result.AddRange(Directory.GetFiles(dir, "*.*")); 

        // C 
        // Add all directories at this directory. 
        foreach (string dn in Directory.GetDirectories(dir)) 
        { 
         stack.Push(dn); 
        } 
       } 
       catch 
       { 
        // D 
        // Could not open the directory 
       } 
      } 
      return result; 
     } 

小道具:http://www.codeproject.com/KB/cs/workerthread.aspx HERESに

0

私の解決策。最初の起動は少し遅いです、私はそれに取り組んでいます。 my.computer.filesystemオブジェクトは、おそらく遅いスタートアップの問題です。しかし、この方法では、ネットワーク経由で31,000ファイルを5分以内にリストします。はるかに良い表現

Imports System.Threading 

Public Class ThreadWork 

Public Shared Sub DoWork() 
    Dim i As Integer = 1 
    For Each File As String In My.Computer.FileSystem.GetFiles("\\172.16.1.66\usr2\syscon\S4_650\production\base_prog", FileIO.SearchOption.SearchTopLevelOnly, "*.S4") 
     Console.WriteLine(i & ". " & File) 
     i += 1 
    Next 
End Sub 'DoWork 
End Class 'ThreadWork 

Module Module1 

Sub Main() 
    Dim myThreadDelegate As New ThreadStart(AddressOf ThreadWork.DoWork) 
    Dim myThread As New Thread(myThreadDelegate) 
    myThread.Start() 
    '"Pause" the console to read the data. 
    Console.ReadLine() 
End Sub 'Main 

End Module 
関連する問題