Frage

Kennt jemand einen schnelleren Weg, um durch ein Verzeichnis und Unterordner aufzuzählen, um alle Dateien in der Aufzählung zu sammeln? Das habe ich gerade:

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

Vielen Dank! JFV

Bearbeiten: Ich werde diese Dateien von einem Serverspeicherort aus zählen. Ich weiß nicht, ob das die Perspektive dieser Frage verändert oder nicht. Vielen Dank für die bisherige Eingabe!

War es hilfreich?

Lösung

Kurze Antwort:

Wenn dieser Code für Ihr Projekt funktional korrekt ist und Sie nicht bewiesen haben, dass er ein Problem mit einem Profiler ist, ändern Sie es nicht. Verwenden Sie weiterhin eine funktional korrekte Lösung, bis Sie nachweisen, dass sie langsam ist.

Lange Antwort:

Wie schnell oder langsam dieses bestimmte Code ist, hängt von a ab viel von Faktoren. Viele davon hängen von der spezifischen Maschine ab, auf der Sie ausgeführt werden (beispielsweise Festplattengeschwindigkeit). Wenn Sie sich den Code ansehen, der das Dateisystem betrifft, und nichts anderes, ist es sehr schwierig zu sagen, dass "X schneller als y" mit einem gewissen Grad an Sicherheit ist.

In diesem Fall kann ich nur eine Sache wirklich kommentieren. Der Rückgabetyp dieser Methode ist ein Array von FileInfo -Werten. Arrays erfordern einen zusammenhängenden Speicher und sehr große Arrays können zu Fragmentierungsproblemen in Ihrem Haufen führen. Wenn Sie haben äußerst Große Verzeichnisse, die Sie lesen, können zu einer Haufenfragmentierung und indirekter Leistungsproblemen führen.

Wenn sich dies als Problem herausstellt, können Sie sich in FindFirstfile / FindNextfile stecken und sie einzeln erhalten. Das Ergebnis wird in CPU -Zyklen wahrscheinlich funktionell langsamer sein, aber weniger Speicherdruck aufweist.

Aber ich muss betonen, dass Sie beweisen sollten, dass dies Probleme vor Ihnen sind Fix Sie.

Andere Tipps

mit System.Collectionss.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;
        }

Requisiten zum ursprünglichen Artikel: http://www.codeproject.com/kb/cs/workerthread.aspx

Dies ist eine grobe Art, dies zu tun.

dir /s /b

Nehmen Sie die Ausgabe davon in eine Textdatei ein, lesen Sie sie und teilen Sie sie durch \r\n.
Führen Sie den obigen Befehl in einem bestimmten Verzeichnis aus, um festzustellen, ob er hilft.

Nur die Verzeichnisse zu bekommen

dir /s /b /ad

Um nur die Dateien zu erhalten

dir /s /b /a-d

Bearbeiten: Jared hat Recht, andere Ansätze nicht zu verwenden, es sei denn, Ihr Ansatz ist langsam erwiesen.

Hier ist meine Lösung. Der anfängliche Start ist etwas langsam, ich arbeite daran. Das Objekt my.computer.filesystem ist wahrscheinlich das Problem für den langsamen Start. In dieser Methode wird jedoch 31.000 Dateien in weniger als 5 Minuten über ein Netzwerk aufgeführt.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top