Pergunta

Alguém sabe de uma maneira mais rápida de enumerar através de um diretório e sub-foldes para reunir todos os arquivos na enumeração? É isso que tenho agora:

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

Obrigado! Jfv

EDIT: Estou enumerando esses arquivos de um local de servidor. Não sei se isso mudará a perspectiva desta pergunta ou não. Obrigado por todos os comentários até agora!

Foi útil?

Solução

Resposta curta:

Se esse código estiver funcionalmente correto para o seu projeto e você não provou ser um problema com um perfilador, não altere -o. Continue usando uma solução funcionalmente correta até provar que ela é lenta.

Resposta longa:

Quão rápido ou lento esta parte do código é depende de um muito de fatores. Muitos dos quais dependerão da máquina específica em que você está executando (por exemplo, velocidade do disco rígido). Olhando para o código que envolve o sistema de arquivos e nada mais, é muito difícil dizer "X é mais rápido que Y" com qualquer grau de certeza.

Nesse caso, só posso comentar sobre uma coisa. O tipo de retorno deste método é uma matriz de valores de fileInfo. As matrizes requerem memória contígua e matrizes muito grandes podem causar problemas de fragmentação em sua pilha. Se você tem extremamente Grandes diretórios que você está lendo, pode levar à fragmentação de heap e problemas indiretamente de desempenho.

Se isso acaba sendo um problema, você poderá pingar no FindFirstFile / FindNextFile e obtê -los um de cada vez. O resultado provavelmente será funcionalmente mais lento nos ciclos da CPU, mas terá menos pressão de memória.

Mas devo enfatizar que você deve provar que esses são problemas antes de você fixar eles.

Outras dicas

usando System.Collections.Genic;

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

Adereços para o artigo original: http://www.codeproject.com/kb/cs/workerthread.aspx

Esta é uma maneira grosseira de fazer isso.

dir /s /b

Obtenha a saída disso em um arquivo de texto, leia -o e divida por \r\n.
Execute o comando acima em um diretório específico, para ver se ele ajuda.

Para obter apenas os diretórios

dir /s /b /ad

Para obter apenas os arquivos

dir /s /b /a-d

EDIT: Jared está certo ao dizer não usar outras abordagens, a menos que sua abordagem seja lenta.

Heres my solution. The initial start up is a little slow, im working on that. The my.computer.filesystem object is probabbly the problem for the slow start up. But this method will list 31,000 files in under 5 minutes over a Network.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top