Pregunta

¿Alguien sabe de una manera más rápida de enumerar a través de un directorio y subcarpetas para reunir todos los archivos en la enumeración? Esto es lo que tengo ahora:

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

¡Gracias! JFV

EDITAR: estoy enumerando estos archivos desde una ubicación de servidor. No sé si eso cambiará la perspectiva de esta pregunta o no. ¡Gracias por todos los aportes hasta ahora!

¿Fue útil?

Solución

Respuesta corta:

Si este código es funcionalmente correcto para su proyecto y no ha demostrado que sea un problema con un generador de perfiles, no lo cambie. Continúe usando una solución funcionalmente correcta hasta que demuestre que es lenta.

Respuesta larga:

La rapidez o lentitud de este código en particular depende de un lote de factores. Muchos de los cuales dependerán de la máquina específica en la que se está ejecutando (por ejemplo, la velocidad del disco duro). Mirando el código que involucra el sistema de archivos y nada más, es muy difícil decir & "; X es más rápido que y &"; con cualquier grado de certeza

En este caso, solo puedo comentar realmente una cosa. El tipo de retorno de este método es una matriz de valores de FileInfo. Las matrices requieren memoria contigua y las matrices muy grandes pueden causar problemas de fragmentación en su montón. Si tiene directorios extremadamente grandes que está leyendo, podría ocasionar fragmentación del montón e indirectamente problemas de rendimiento.

Si eso resulta ser un problema, entonces puede PInvocar en FindFirstFile / FindNextFile y obtenerlos de uno en uno. Es probable que el resultado sea funcionalmente más lento en los ciclos de la CPU, pero tendrá menos presión de memoria.

Pero debo enfatizar que debe probar que estos son problemas antes de solucionarlos .

Otros consejos

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

Accesorios para el artículo original: http://www.codeproject.com/KB/ cs / workerthread.aspx

Esta es una forma cruda de hacerlo.

dir /s /b

Obtenga el resultado de esto en un archivo de texto, léalo & amp; dividido por \r\n.
Ejecute el comando anterior en un directorio específico para ver si ayuda.

Para obtener solo los directorios

dir /s /b /ad

Para obtener solo los archivos

dir /s /b /a-d

EDITAR: Jared tiene razón al decir que no use otros enfoques a menos que se demuestre que su enfoque es lento.

Aquí está mi solución. El inicio inicial es un poco lento, estoy trabajando en eso. El objeto my.computer.filesystem es probablemente el problema para el inicio lento. Pero este método enumerará 31,000 archivos en menos de 5 minutos a través de una red.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top