Verzeichnis in Textdatei abbilden

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Verzeichnis in Textdatei abbilden

    Hallo,
    ich möchte ein Verzeichnich mit "Io.directory.getfiles" auslesen und die Ergenisliste strukturiert in einer Textdatei ablegen.
    Etwa so:

    ->C:\Tmp
    Unterverzeichnis1
    Unterverzeichnis2
    Unterverzeichnis3
    Datei1
    Datei2
    Datei3
    ->Unterverzeichnis1
    Unterverzeichnis1-1
    Unterverzeichnis1-2
    Unterverzeichnis1-3
    Datei1-1
    Datei1-2
    Datei1-3
    usw.
    Wie schaffe ich hier eine einfache und elegante Lösung?

    Ich_bastel_in_VB schrieb:

    Wie schaffe ich hier eine einfache und elegante Lösung?
    Mach mal eine Input-Liste und die gewünschte Output-Liste, da wissen wir nämlich ganz genau, was Dir vorschwebt.
    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!
    kann ich coden, also dass Unterverzeichnisse eingerückt dargestellt werden.
    Bloss ist eine Textdatei ziemlich ungeschickt für sowas.
    Wieso willst du das als Text darstellen?
    Ein Verzeichnisbaum gehört in einer Treeview dargestellt.
    Und abzuspeichern wäre das am Einfachsten mit Serialisierung, mw. XML-Serialisierung.
    Guten Morgen,
    ich benötige die Textdatei als Schnittstelle (.csv) für ein externes Programm hier muß auch die Struktur wie oben beschreiben eingehalten werden.
    Das Verzeichnis lese ich mit folgendem Code ein:

    Quellcode

    1. Dim StammVerz As String = TextBox1.Text
    2. Try
    3. IO.File.WriteAllLines("c:\temp\blabla.txt", IO.Directory.GetFiles(StammVerz, "*.txt", SearchOption.AllDirectories))
    4. Catch ex As Exception
    5. '...
    6. End Try

    Ich_bastel_in_VB schrieb:

    Das Verzeichnis lese ich mit folgendem Code ein:
    Führe bitte an einem Beispiel vor, wie Dein Input (eine Zeile dieser Datei) und der von Dir gewünschte Output dazu aussieht bzw. aussehen soll.
    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!
    hier kommen die Input und Output Dateien.
    Input
    K:\Export\ABT\ABT05.txt
    K:\Export\ABT\ABT06.txt
    K:\Export\AFE\AFE26.txt
    K:\Export\AK\AK.txt
    K:\Export\AK\AK08.txt
    K:\Export\AK\AK121.txt
    K:\Export\AK\AK81.txt

    Output
    CHAPTER;Export
    Keywords;Name
    Types;String
    ABT;ABT
    AFE;AFE
    AK;AK
    AKU;AKU
    ASW;ASW
    AW;AW
    END

    ENDCHAPTER;ABT
    Keywords;Section
    Types;String
    ABT;ABT;K:\Export\ABT\ABT05.txt
    ABT;ABT;K:\Export\ABT\ABT06.txt
    END

    ENDCHAPTER;AFE
    Keywords;Section
    Types;String
    AFE;AFE;K:\Export\AFE\AFE26.txt
    END
    nanu?
    in post#1 sieht die Struktur aber ganz anders aus.

    Verstehe ich das richtig, dass "Input" keine Datei ist, sondern das ist einfach eine Auflistung einiger Datei-Fullnames deines Dateisystems.

    Und die Struktur in post#1 war Quatsch?
    Sondern tatsächlich soll eine Struktur wie in "Output" generiert werden?

    Ich_bastel_in_VB schrieb:

    K:\Export\ABT\ABT05.txt
    packst Du in eine FileInfo-Instanz.
    Diese liefert Dir eine DirectoryInfo-instanz und diese hat eine Parent-Property.
    Den Rest musst Du per String-Operation ermitteln oder Dir aus den Fingern saugen.

    VB.NET-Quellcode

    1. Dim fi = New IO.FileInfo("K:\Export\ABT\ABT05.txt")
    2. MessageBox.Show(fi.Directory.Parent.ToString)
    Bilder
    • DirectoryInfo.jpg

      94,98 kB, 754×638, 155 mal angesehen
    • FileInfo.jpg

      107,3 kB, 754×686, 162 mal angesehen
    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!
    Das ist keine gute Idee, das gewünschte Ergebnis vereinfacht darzustellen. Weil dann kriegst du eine vereinfachte Lösung, die aber nicht funktioniert - man könnte auch sagen: keine Lösung.
    Probleme muss man immer ganz genau definieren.

    Zb hab ich noch eine Nachfrage: wie sähe der Output aus bei folgendem Input:

    Quellcode

    1. K:\Export\ABT\ABT05.txt
    2. K:\Export\ABT\ABT06.txt
    3. K:\Export\ABT\ABT\ABT06.txt
    4. K:\Export\AFE\AFE26.txt
    5. K:\Export\AK\AK.txt
    6. K:\Export\AK\AK08.txt
    7. K:\Export\AK\AK121.txt
    8. K:\Export\AK\AK81.txt
    (also eine Datei ist noch tiefer eingeschachtelt, und Namen kommen doppelt vor, nur in verschiedenen Ordnern)
    das Ergebnis würde das wäre dann so:
    CHAPTER;Export
    Keywords;Name
    Types;String
    ABT;ABT
    AFE;AFE
    AK;AK
    END

    ENDCHAPTER;ABT
    Keywords;Section
    Types;String
    ABT\ABT;ABT\ABT;
    ABT05;ABT05;K:\Export\ABT\ABT05.txt
    ABT06;ABT06;K:\Export\ABT\ABT06.txt
    END

    ENDCHAPTER;ABT\ABT
    Keywords;Section
    Types;String
    ABT06;ABT06;K:\Export\ABT\ABT\ABT06.txt
    END

    ENDCHAPTER;AFE
    Keywords;Section
    Types;String
    AFE26;AFE26;K:\Export\AFE\AFE26.txt
    END

    ENDCHAPTER;AK
    Keywords;Section
    Types;String
    AK;AK;K:\Export\AK\AK.txt
    AK08;AK08;K:\Export\AK\AK08.txt
    AK121;AK121;K:\Export\AK\AK121.txt
    AK81;AK81;K:\Export\AK\AK81.txt
    END
    jo, dann probierma dieses:

    VB.NET-Quellcode

    1. Private Shared Sub CreateTableOfContents(path As String, outputFile As String)
    2. Dim outputList As New List(Of String)
    3. Dim skipChars As Integer
    4. Dim WriteHeader As Action(Of DirectoryInfo) = _
    5. Sub(di)
    6. outputList.Add("ENDCHAPTER;", di.FullName.Substring(skipChars))
    7. outputList.Add("Keywords;Section")
    8. End Sub
    9. Dim WriteEntries As Action(Of DirectoryInfo(), FileInfo()) = _
    10. Sub(dis, fis)
    11. outputList.Add("Types;String")
    12. For Each di In dis
    13. Dim nm = di.FullName.Substring(skipChars)
    14. outputList.Add(nm, ";", nm, ";")
    15. Next
    16. For Each fi In fis
    17. Dim nm = GetFullnameWithoutExtension(fi.FullName).Substring(skipChars)
    18. outputList.Add(nm, ";", nm, ";", fi.FullName)
    19. Next
    20. outputList.Add("End")
    21. outputList.Add("")
    22. End Sub
    23. Dim recurse As Action(Of DirectoryInfo()) = _
    24. Sub(dis)
    25. For Each di In dis
    26. Dim childs As DirectoryInfo()
    27. Try
    28. childs = di.GetDirectories
    29. Catch ex As UnauthorizedAccessException
    30. Return
    31. End Try
    32. WriteHeader(di)
    33. WriteEntries(childs, di.GetFiles)
    34. recurse(childs)
    35. Next
    36. End Sub
    37. Dim root = New DirectoryInfo(path)
    38. Dim rootChilds = root.GetDirectories
    39. skipChars = root.FullName.Length + 1
    40. outputList.Add("CHAPTER;", root.Name)
    41. outputList.Add("Keywords;Name")
    42. WriteEntries(rootChilds, root.GetFiles)
    43. recurse(rootChilds)
    44. File.WriteAllLines(outputFile, outputList)
    45. End Sub
    Das sind 3 anonyme Methoden in einer richtigen Methode, und recurse ist eine rekusive anonyme Methode
    Ach - ausserdem brauchst du noch ein Modul mit dieser Extension:

    VB.NET-Quellcode

    1. Public Module StringX
    2. <Extension()> _
    3. Public Sub Add(ByVal lst As List(Of String), ByVal ParamArray items As Object())
    4. lst.Add(String.Concat(items))
    5. End Sub
    6. end Module