Pfad wird komisch geschreiben

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von VincentTB.

    Pfad wird komisch geschreiben

    Moin,

    ich wollte mein Programm namens TempCleaner mal ein bisschen erweitern. Das Programm an sich soll nichts weiter machen, als den Temp-Ordner bei jedem Start des Computers zu leeren.
    Da ich aber das Programm ein bisschen erweitern möchte, habe ich jetzt versucht, dass das Programm eine Textdatei erstellt, in die es dann einfach jede Datei hineinschreibt, die gelöscht wurde. Ich dachte, dass das eigentlich ganz einfach werden würde aber irgendwie wird der Pfad total verschlüsselt ausgegeben.
    Aus C:\Windows\Temp\Neues Textdokument.txt wird dann zum Beispiel C:Win19ow57Te16pNeue57 Tex19oku16en.x
    Ich habe es bereits mit einer ArrayList oder einer ListBox versucht, um die Pfade der Dateien und Ordner zu sammeln aber bei beiden kommt das selbe.
    Für das Löschen der Dateien in dem Ordner benutze ich diesen Code:

    VB.NET-Quellcode

    1. Dim f As String
    2. For Each f In IO.Directory.GetFiles(Temp)
    3. Try
    4. IO.File.Delete(f)
    5. result += 1
    6. 'files_list.Add(Now.ToString("[hh:mm:ss]: " + f))
    7. ListBox1.Items.Add(f)
    8. Catch ex As Exception
    9. End Try
    10. Next

    Zum Löschen der Ordner benutze ich:

    VB.NET-Quellcode

    1. Dim d As String
    2. For Each d In IO.Directory.GetDirectories(Temp)
    3. Try
    4. IO.Directory.Delete(d, True)
    5. result += 1
    6. ListBox1.Items.Add(d)
    7. 'files_list.Add(Now.ToString("[hh:mm:ss]: " + d))
    8. Catch ex As Exception
    9. End Try
    10. Next

    Und zum Schreiben der gelöschten Dateien:

    VB.NET-Quellcode

    1. For Each item In ListBox1.Items
    2. sw.WriteLine(Now.ToString("[hh:mm:ss]: " + item))
    3. Next

    Hat da jemand vielleicht eine Idee, was der Fehler sein könnte?

    Liebe Grüße

    PS:
    Dadurch, dass ich bei der Methode IO.Directory.Delete() das löschen der Unterordner und der Dateien auf True gesetzt habe, wird das Ergebnis der insgesamt gelöschten Dateien und Ordner verfälscht. Das Problem ist jetzt nicht äußerst relevant aber wenn ihr eine Idee habt, wie ich wirklich jeden Unterordner und jede Datei in den jeweiligen Unterordnern zählen kann, könnt ihr es ja gerne dazuschreiben :)
    Ich kam, sah und vergaß, was ich vorhatte.

    Cozy schrieb:

    VB.NET-Quellcode

    1. sw.WriteLine(Now.ToString("[hh:mm:ss]: " + item))
    Die Klammer zu ist falsch.
    Machst Du

    VB.NET-Quellcode

    1. sw.WriteLine(Now.ToString("[hh:mm:ss]: ") & item.ToString())

    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!
    @RodFromGermany Danke! Hättest du eine Idee, wie ich die Unterordner etc. zählen kann?
    Ich kam, sah und vergaß, was ich vorhatte.
    Definiere

    Cozy schrieb:

    Unterordner
    Du könntest die Anzahl der "\" im Pfad ermitteln und dann ermitteln, wie viele Pfade es mit einem, zweien usw. "\" gibt.
    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!
    @RodFromGermany obwohl ich glaube ich lasse es lieber. Ich meine es könnten ja fast unendlich Unterordner sein und das kann ich ja nicht alles nachfragen und prüfen bzw ich glaube, dass das nicht geht.
    Ich kam, sah und vergaß, was ich vorhatte.

    Cozy schrieb:

    ich glaube, dass das nicht geht.
    Das ist auf jeden Fall eine interessante Aufgabenstellung.
    Auf jeden Fall könntest Du über ein NUD die Ordnung vorgeben und dann alles bis dahin auflisten.
    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!

    Cozy schrieb:

    alles nachfragen und prüfen bzw ich glaube, dass das nicht geht.
    Alle FilesystemInfos - sowohl Dateien als auch Ordner - auch verschachtelt - ruft man mit System.IO.DirectoryInfo.GetFileSystemInfos(String, System.IO.SearchOption) As System.IO.FileSystemInfo() ab - kannste dir mal im ObjectBrowser angugge.
    Einziges Prob könnte sein, dasses paar sekunden dauert, wenn seeeehr viele FileSystemInfos aufzulisten sind.
    @ErfinderDesRades
    Halt ich für eine eher schlechte Lösung, weil dann die Informationen zu allen Dateien aus Temp in den Arbeitsspeicher geladen werden. Besser fände ich dann sowas wie

    VB.NET-Quellcode

    1. For Each fileSystemInfo As FileSystemInfo In New DirectoryInfo(Path.GetTempPath()).EnumerateFileSystemInfos("*", SearchOption.AllDirectories)
    2. Console.WriteLine(fileSystemInfo.FullName)
    3. 'Hier kann man dann auch löschen
    4. Next
    Mfg
    Vincent

    VincentTB schrieb:


    VB.NET-Quellcode

    1. 'Hier kann man dann auch löschen
    eben nicht!
    Löschen von Elementen, während die Enumeration dieser Elemente noch gar nicht abgeschlossen ist, dürfte ganz unvorhersehbare Ergebnisse zeitigen.

    Evtl aber auch einfach nur die entsprechende Exception, dass sowas unzulässig ist.
    @ErfinderDesRades
    Ich wüsste nicht wieso, intern wird meines Wissens nach bei jeder Enumeration FindNextFile aufgerufen, bei dem es kein Problem ist, wenn man die Datei dann einfach löscht, siehe hier. Das ist ja was gänzlich anderes, als wenn man eine Liste oder ein Array durchläuft.

    Hab das auch gerade getestet, funktioniert 1a.
    Mfg
    Vincent