gibt es eine Grenze bei My.Computer.FileSystem.GetFiles

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von jan99.

    gibt es eine Grenze bei My.Computer.FileSystem.GetFiles

    Moin!

    ich möchte die Dateinamen in einer Strutkur analysieren die zur Zeit um die 80.000+ Dateien beinhaltet.

    Hierzu habe ich folgende Auswerteschleife

    VB.NET-Quellcode

    1. For Each Datei As String In My.Computer.FileSystem.GetFiles(_Root, FileIO.SearchOption.SearchAllSubDirectories, "*.*")
    2. _CountFilesDetected += 1
    3. _Log.Write(_CountFilesDetected.ToString & " - " & Datei & " -> " & Datei.Length, CountCrlf:=1)
    4. Console.Write(_CountFilesDetected.ToString & " - " & Datei & " -> " & Datei.Length)
    5. Dim AnzahlZeichen As Integer = Datei.Length
    6. If AnzahlZeichen > _MaxFileNameCount Then _MaxFileNameCount = Datei.Length
    7. If AnzahlZeichen > 256 Then
    8. _CountFiles2Long += 1
    9. _Web.Write(String.Format(" <tr><td>{0}</td><td>{1}</td></tr>", AnzahlZeichen, Datei.Substring(AnzahlZeichenRoot)))
    10. End If
    11. Next


    Wenn _Root=\\local.xxxx.de\ebl-daten\Abteilung\xxx\yyy\GKG\Grundstücke\M\Malmöstraße ist, dann wird die Schleife durchlaufen.

    Ist _Root hingegen \\local.xxxx.de\ebl-daten\Abteilung\xxx\yyy\GKG\Grundstücke\M - dann werden 7250 Dateien durchlaufen.

    Aber bei \\local.xxxx.de\ebl-daten\Abteilung\xxx\yyy\GKG\Grundstücke dann passiert gar nichts.

    Kann es sein, dass die Funktion an ihrer Leistungsgrenze ist und gibt es eine Alternative? Schon bei den 7250 dauert es eine Weile, bis die Analyse der Dateien abgeschlossen ist und die eigentliche Auswerteschleife abgearbeitet wird.

    Hier manuell über alle Buchstaben der Straßen zu gehen ist keine Alternative, da das Programm auch an anderer Stelle mit gleicher Dateianzahl laufen soll.

    Gruß Jan
    Ist mir nicht bekannt.
    Allerdings gibts bei manchen Directories eine Exception.
    Und wenn man TryCatch unreflektiert anwendet, catcht man sich die ja selber weg - so kanns kommen, dass die Information über die Exception aus-, und nur ein wunderliche Verhalten ver-bleibt.

    Und im FormLoad ausgeführter Code - der verschluckt auch Exceptions
    @jan99 Vom Gefühl her würde ich sagen: Die Grenze liegt bei Integer.MaxValue und die liegt bei 2,147,483,647.
    Da hast Du noch ne Weile Zeit, bis das voll ist. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielleicht ist ja einfach das Filesystems des Servers oder das Netzwerk der Flaschenhals.
    Gib doch mal in CMD ein:

    Quellcode

    1. DIR /S \\local.xxxx.de\ebl-daten\Abteilung\xxx\yyy\GKG\Grundstücke
    und beobachte das Zeitverhalten und eventuelle Fehlermeldungen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Noch eine Anmerkung bezüglich der Laufzeit, Ausgaben wie zb. Console.Write verzögern ebenfalls die Ausführung.
    Ich weiß zwar nicht was hinter deinen _Log.Write und _Web.Write steckt, aber das wird sicher auch Zeit kosten.

    Beispiel:

    C#-Quellcode

    1. int a = 0;
    2. for (int i = 0; i < 200000; i++)
    3. {
    4. Console.WriteLine(i);
    5. a++;
    6. }
    7. // 00:00:13.9601962


    C#-Quellcode

    1. int a = 0;
    2. for (int i = 0; i < 200000; i++)
    3. {
    4. a++;
    5. }
    6. // 00:00:00.0005955


    Auch würde ich My.Computer.FileSystem.GetFiles wegschmeißen (generell den gesamten My-Namespace) und gegen Directory.GetFiles tauschen.
    Moin!

    ich habe noch etwas weiter gesucht und damit hat es funktioniert:

    VB.NET-Quellcode

    1. Dim files = From file In Directory.EnumerateFiles(_Root, "*.*", SearchOption.AllDirectories)
    2. For Each f In files
    3. _CountFilesDetected += 1
    4. Dim AnzahlZeichen As Integer = f.Length
    5. If AnzahlZeichen > _MaxFileNameCount Then _MaxFileNameCount = f.Length
    6. If AnzahlZeichen > 256 Then
    7. _CountFiles2Long += 1
    8. .Write(AnzahlZeichen.ToString.PadLeft(6, " ") & " - ..." & f.Substring(AnzahlZeichenRoot), 1)
    9. End If
    10. Next


    Warum auch immer...

    Gruß Jan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()