Question

Quelqu'un sait-il qu'il existe un moyen plus rapide d'énumérer un répertoire et des sous-dossiers pour rassembler tous les fichiers de l'énumération? C'est ce que j'ai en ce moment:

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

Merci! JFV

EDIT: Je énumère ces fichiers depuis un emplacement de serveur. Je ne sais pas si cela changera le point de vue de cette question ou non. Merci pour tous vos commentaires!

Était-ce utile?

La solution

Réponse courte:

Si ce code est fonctionnellement correct pour votre projet et que vous n'avez pas prouvé que c'était un problème avec un profileur, alors ne le modifiez pas. Continuez à utiliser une solution fonctionnellement correcte jusqu'à ce que vous prouviez qu'elle est lente.

Réponse longue:

La rapidité ou la lenteur de ce morceau de code dépend de plusieurs lots . Beaucoup dépendront de la machine spécifique sur laquelle vous travaillez (par exemple, la vitesse du disque dur). En regardant le code qui implique le système de fichiers et rien d’autre, il est très difficile de dire que & «X est plus rapide que y &»; avec aucun degré de certitude.

Dans ce cas, je ne peux vraiment commenter qu'une chose. Le type de retour de cette méthode est un tableau de valeurs FileInfo. Les tableaux nécessitent de la mémoire contiguë et de très grands tableaux peuvent entraîner des problèmes de fragmentation dans votre segment de mémoire. Si vous lisez des extrêmement répertoires volumineux, vous risquez de provoquer une fragmentation du tas et, indirectement, des problèmes de performances.

Si cela s'avère être un problème, vous pouvez PInvoke dans FindFirstFile / FindNextFile et les obtenir un à la fois. Le résultat sera probablement fonctionnellement plus lent dans les cycles de la CPU, mais aura moins de pression sur la mémoire.

Mais je dois souligner que vous devez prouver que ce sont des problèmes avant de les résoudre .

Autres conseils

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

Éléments de l'article original: http://www.codeproject.com/KB/ cs / workerthread.aspx

C’est une façon brute de le faire.

dir /s /b

Récupérez le résultat dans un fichier texte, lisez-le & amp; divisé par \r\n.
Exécutez la commande ci-dessus dans un répertoire spécifique pour voir si elle vous aide.

Pour obtenir uniquement les répertoires

dir /s /b /ad

Pour obtenir uniquement les fichiers

dir /s /b /a-d

EDIT: Jared a raison de dire de ne pas utiliser d’autres approches à moins que votre approche s’avère lente.

Voici ma solution. La mise en route initiale est un peu lente, je travaille dessus. L'objet my.computer.filesystem est probablement le problème du démarrage lent. Mais cette méthode répertoriera 31 000 fichiers en moins de 5 minutes sur un réseau.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top