質問

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

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

ありがとう! JFV

編集:私は、サーバーの場所からこれらのファイルを列挙しています。それがこの質問の視点を変更したりしませんかどうかはわかりません。すべての入力をありがとう今のところ!

役に立ちましたか?

解決

短い答えます:

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

長い答えます:

どのくらいの速さや、コードのこの特定の部分を遅らせることの多くの要因ののに依存しています。そのうちの多くは、あなたが(例えば、ハードドライブの速度のために)上で実行されている特定のマシンに依存します。ファイルシステムと他には何が含まれたコードを見てみると、それは確信の任意の程度との「xがyよりも高速である」と言うことは非常に困難です。

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

それが問題であることが判明した場合、

あなたはFindFirstFile / FindNextFileへのPInvokeし、それらを一つずつ取得することができます。その結果、CPUサイクルで機能的に遅くなる可能性が高くなりますが、少ないメモリの圧力を持っています。

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

他のヒント

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する

このはそれをやって粗な方法です。

dir /s /b

\r\nことによってそれ&スプリットを読み、テキストファイルにこの出力を取得します。
それが助けかどうかを確認するために、特定のディレクトリに上記のコマンドを実行します。

ディレクトリのみを取得するには、

dir /s /b /ad

ファイルだけを取得するには、

dir /s /b /a-d

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

HERESに私の解決策。最初の開始までは、その上で作業少し遅い、イムです。 my.computer.filesystemオブジェクトはprobabblyスロースタートアップのための問題です。しかし、この方法は、ネットワークを介して5分以内に31,000のファイルが一覧表示されます。

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top