Große Datenmengen effizient in einen Text File schreiben

  • VB.NET

Es gibt 51 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    ErfinderDesRades schrieb:

    welchen Datentyp hat ListDirectories ?
    List(Of String) - Warum nicht List(Of DirectoryInfo)?

    Was übergibst du hier: Public Function EnumerateDirectories(parentDirectory As String, ...?
    einen String - warum kein DirectoryInfo?


    Ganz einfach: weil ich genau den Namen des Verzeichnisses benötige. Und sonst nix!

    Jetzt hör doch mal auf, um den heißen Brei herumzureden. Lass uns das jetzt endlich mal auf den Punkt bringen:

    Ich benötige eine Liste der in einem Verzeichnis enthaltenen FILENAMEN, zusammen mit der SIZE und dem LASTWRITEDATE der Files. Nicht mehr und nicht weniger.

    Mein Coding verwendet dazu im Prinzip folgende TechniK:

    VB.NET-Quellcode

    1. 'Process file entries
    2. Dim RealFileList As String()
    3. RealFileList = Directory.GetFiles(parentDirectory)
    4. For Each fiName In RealFileList
    5. Dim fi As FileInfo = New FileInfo(fiName) 'Get file info
    6. '...
    7. Next


    Das funktioniert zwar scheint aber nicht sonderlich performant zu sein.

    Jetzt will ich deinem kryptischen Hinweis folgen und statt String() eine List(of FileInfo) verwenden. In der Hoffnung, dass dies meine Anforderungen performanter realisiert. Aber ich habe leider KEINE Ahnung wie das gehen soll. Mein etwas hilfloser Versuch scheitert natürlich:

    VB.NET-Quellcode

    1. Dim RealFileList As List(Of FileInfo)
    2. RealFileList = Directory.GetFiles(parentDirectory)


    So geht's also nicht. Mir fehlen hier schlicht und ergreifend Informationen, wie dies konzeptionell und syntaxmäßig abzuhandeln ist.

    Das mag durchaus daran liegen, dass ich ganz besonders ignorant bin, dass ich eure Beiträge nicht genau lese oder dass ich ganz einfach viel zu blöd bin. Aber so bin ich halt nun mal und damit sollte auch dieses Thema final abgehandelt sein. :)

    Ich hoffe, dass jetzt jemand so unendlich nett ist und mir meine Frage präzise und ohne Umschweife beantworten wird. :)

    LG
    Peter

    Peter329 schrieb:

    FileInfo
    Das geht so:

    VB.NET-Quellcode

    1. Dim fi() = New IO.DirectoryInfo("c:\Temp\").GetFiles("*.*", IO.SearchOption.AllDirectories)

    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!
    Ach RFG ... das war es was ich wissen wollte ! Das werde ich dir nie vergessen, dass du diesem Thread eine neue Wendung gegeben hast. :)

    So jetzt bleibt noch eine Kleinigkeit. Ich muss damit klar kommen, dass ich auf Verzeichnisse nicht zugreifen kann (Unauthorized Access Exception). Damit scheitert die Sache natürlich und ich muss das abfangen:

    VB.NET-Quellcode

    1. Try
    2. Dim di() = New IO.DirectoryInfo(parentDirectory).GetFiles("*.*", IO.SearchOption.AllDirectories)
    3. Catch ex As Exception
    4. ...
    5. Exit Sub
    6. End Try
    7. For Each fiName In di
    8. ...
    9. Next


    Ehe es mir jemand erklärt, so geht das natürlich nicht, weil dann "di" außerhalb des Try - Catch Blocks nicht mehr verfügbar ist.

    Wie kann ich denn di außerhalb Try -Catch deklarieren und innerhalb Try - Catch befüllen.

    So klappt es jedenfalls nicht ...

    VB.NET-Quellcode

    1. Dim di() As DirectoryInfo
    2. Try
    3. di() = New IO.DirectoryInfo(parentDirectory).GetFiles("*.*", IO.SearchOption.AllDirectories)

    VB.NET-Quellcode

    1. Dim di As New List<DirectoryInfo>
    2. Try
    3. di = IO.DirectoryInfo(parentDirectory).GetFiles("*.*", IO.SearchOption.AllDirectories)
    4. [...]
    Müsste so eig. stimmen und funktionieren

    €dit: Habe das Gefühl, ich hab C# und VB.Net vermischt...
    Ich Antworte nach bestem Wissen und Gewissen. Ich übernehme keine Garantie für die Richtigkeit oder Fehlerfreiheit meiner Texte.


    Ich konnte dir helfen?
    - Das ist schön :) Ich würde mich über ein "Hilfreich" freuen ^^

    Peter329 schrieb:

    So klappt es jedenfalls nicht ...
    aber so:

    VB.NET-Quellcode

    1. Dim fi() As IO.FileInfo ' <====
    2. Try
    3. fi = New IO.DirectoryInfo("c:\Temp\\").GetFiles("*.*", IO.SearchOption.AllDirectories)
    4. Catch ex As Exception
    5. End Try
    Das ist FileInfo, nicht aber DirectoryInfo.
    Über die Instanz der DirectoryInfo werden die FileInfo's ausgelesen.
    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!
    Supiii ... so klappt das !

    Jetzt wäre ich FAST perfectly happy ...

    ... aber, das Verfahren scheitert leider, sobald in dem Directory auch nur EIN directory enthalten ist, auf das ich keinen Zugriff habe!

    Iss ja auch klar ... der Befehl kann nicht ausgeführt werden und damit ist die Sache am Ende!

    Start: C:\
    Eine Ausnahme (erste Chance) des Typs "System.UnauthorizedAccessException" ist in mscorlib.dll aufgetreten.

    Ich hab das ungute Gefühl, dass mich EDR hier in eine Sackgasse geführt hat! :D

    Das ist heute nicht mein Tag ... :(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    Arrays können nicht mit NEW deklariert werden
    In der New-Zeile dürfen dann keine Klammern mehr stehen.
    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!
    Guck dir den Post von RFG mal bitte an: -> Große Datenmengen effizient in einen Text File schreiben

    Ihm ist etwas aufgefallen, das mir nicht aufgefallen ist
    Ich Antworte nach bestem Wissen und Gewissen. Ich übernehme keine Garantie für die Richtigkeit oder Fehlerfreiheit meiner Texte.


    Ich konnte dir helfen?
    - Das ist schön :) Ich würde mich über ein "Hilfreich" freuen ^^

    Peter329 schrieb:

    in eine Sackgasse geführt hat!
    Nicht ganz.
    Im Fall einer Exception musst Du Dir die Liste der DirectoryInfos holen und die einzeln durchscannen, da bekommst Du alle erlaubten Files.

    VB.NET-Quellcode

    1. Dim di() = New IO.DirectoryInfo("c:\Temp\\").GetDirectories("*.*", IO.SearchOption.AllDirectories)

    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!
    gottlob hast du dich jetzt endlich mal durchgerungen, DirectoryInfos zu verwenden.
    War das so kryptisch, was ich von mir gegeben hab? ObjectBrowser habe ich dir genannt, und das Tutorial mit fertigem Code dafür.
    Und SimpleSoft hats auch nochmal vorgeturnt, allerdings in c#.
    Also jeder einzelne dieser drei Hinweise hätte ausreichen müssen, weil Grundlagen fehlen ja nicht wirklich - immerhin bist du imstande eine Rekursive Funktion hinzukriegen.
    Einzig ein Codebeispiel hamwa dir vorenthalten - ohne RFGs Dienste wäre das wirklich unerreichbar gewesen?

    Und SearchOption.AllDirectories ist eine Sackgasse, aber das wurde schon vor 35 Posts erläutert.
    So, jetzt hab ich wohl die finale Version der Routine.

    If verwende jetzt die "Option.TopDirectoryOnly" für den Aufruf. Die allfällige UA Exception fange ich mit Try - Catch ab. Andernfalls verarbeite ich die FileInfo List. Und anschließend hole ich mir die Subdirectory Liste und rufe das Ganze pro Eintrag rekursiv wieder auf. Der Benchmark Test sieht jetzt blendend aus:

    Start : C:\ Algo=NEW
    Dirs : 42134
    UAEx : 548
    cntFiles : 212895
    BuffLen : 17.923.140 Bytes
    Elapsed : 10 seconds

    Da kann man nich meckern! :)

    Also, rundum ein herzliches Dankeschön an alle Ratgeber. Ohne euch hätte ich das so nicht hinbekommen. Die Hartnäckigkeit hat sich gelohnt. Und ich habe eine Menge dabei gelernt.

    Und damit kriegt der Thread jetzt wieder seinen verdienten erledigt Haken! :)

    LG
    Peter

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()