Domanda

Qualcuno conosce un modo più veloce per enumerare attraverso una directory e sottocartelle per raccogliere tutti i file nell'enumerazione? Questo è quello che ho adesso:

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

Grazie! JFV

EDIT: sto elencando questi file da una posizione del server. Non so se questo cambierà o meno la prospettiva di questa domanda. Grazie per tutto l'input finora!

È stato utile?

Soluzione

Risposta breve:

Se questo codice è funzionalmente corretto per il tuo progetto e non hai dimostrato di essere un problema con un profiler, non modificarlo. Continuare a utilizzare una soluzione funzionalmente corretta fino a quando non si dimostra che è lento.

Risposta lunga:

La velocità o la lentezza di questo particolare codice dipende da un lotto di fattori. Molti dei quali dipenderanno dalla macchina specifica su cui si sta eseguendo (ad esempio la velocità del disco rigido). Guardando il codice che coinvolge il file system e nient'altro, è molto difficile dire & Quot; x è più veloce di y & Quot; con qualsiasi grado di certezza.

In questo caso, posso davvero commentare solo una cosa. Il tipo restituito da questo metodo è un array di valori FileInfo. Le matrici richiedono memoria contigua e matrici molto grandi possono causare problemi di frammentazione nell'heap. Se hai estremamente directory di grandi dimensioni che stai leggendo, potresti portare a frammentazione dell'heap e problemi di prestazioni indirette.

Se questo risulta essere un problema, puoi inserire PInvoke in FindFirstFile / FindNextFile e ottenerli uno alla volta. Il risultato sarà probabilmente funzionalmente più lento nei cicli della CPU ma avrà una pressione della memoria inferiore.

Ma devo sottolineare che dovresti dimostrare che questi sono problemi prima di risolverli .

Altri suggerimenti

utilizzando 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;
        }

Suggerimenti per l'articolo originale: http://www.codeproject.com/KB/ cs / workerthread.aspx

Questo è un modo rozzo di farlo.

dir /s /b

Ottieni l'output di questo in un file di testo, leggilo & amp; diviso per \r\n.
Esegui il comando sopra in una directory specifica, per vedere se aiuta.

Per ottenere solo le directory

dir /s /b /ad

Per ottenere solo i file

dir /s /b /a-d

EDIT: Jared ha ragione nel dire di non usare altri approcci a meno che il tuo approccio non sia dimostrato lento.

Ecco la mia soluzione. L'avvio iniziale è un po 'lento, ci sto lavorando. L'oggetto my.computer.filesystem è probabilmente il problema dell'avvio lento. Ma questo metodo elencherà 31.000 file in meno di 5 minuti su una rete.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top