CheckedListBox befüllen mit Verzeichnissen/Dateien(namen), auslesen und kopieren

  • VB.NET

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

    CheckedListBox befüllen mit Verzeichnissen/Dateien(namen), auslesen und kopieren

    Hallo erstmal,

    Ausgangs Situation:

    Ich habe Eine WindowsForm (Entwurf siehe Screnshot);

    2x CheckedListBox
    3x Button
    1x ProgressBar

    Ich möchte;
    1. Das die CheckedListBoxen die "Items" aus den Vorhandenen Dateien/Unterordnern aus den gewählten Verzeichnisen darstellen.
    2. Das sich das Programm merkt welche "Items" -> Ordner/Dateien ausgewählt wurden und dass diese sich dann in ein anderes Verzeichnis kopieren.

    Was ich bis jetzt hin bekommen habe/Ich mir noch erarbeiten will:
    Ich kann den CheckedListBoxen zwar sagen gebt den Pfad der Dateien wieder aber nicht "nur den letzten Teil"
    Dateien und/oder Ordner Kopieren


    Relevanter (teilstück, weil die anderen "Tabs" gehen schon so wie sie sind) Code bisher:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Public Class mainForm
    4. Dim _CSC As String
    5. Dim _T9DB As String
    6. Dim _ValuePath As String
    7. Dim _Path As String
    8. Dim _FixedPath As String = My.Application.Info.DirectoryPath
    9. Dim _SolutionPath As String = _FixedPath + "Solution"
    10. Dim _TempPath As String = Path.Combine(My.Application.Info.DirectoryPath, "Temp")
    11. Dim _DataPath As String = Path.Combine(My.Application.Info.DirectoryPath, "Data")
    12. Private Sub mainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    13. 'Befüllen der Steuerelemente
    14. XT9CheckedListBox.Items.AddRange(IO.Directory.GetFiles(Path.Combine(_DataPath, "T9DB")))
    15. languageCheckedListBox.Items.AddRange(IO.Directory.GetDirectories(Path.Combine(_DataPath, "CSC")))
    16. End Sub
    17. Private Sub readIn2Button_Click(sender As System.Object, e As System.EventArgs) Handles readIn2Button.Click
    18. _ValuePath = _CSC
    19. _Path = Path.Combine(My.Application.Info.DirectoryPath, _ValuePath)
    20. _CSC = CStr(languageCheckedListBox.SelectedItem)
    21. _T9DB = CStr(XT9CheckedListBox.SelectedItem)
    22. End Sub
    23. Private Sub build2Button_Click(sender As System.Object, e As System.EventArgs) Handles build2Button.Click
    24. build2ProgressBar.Value = +10
    25. My.Computer.FileSystem.CreateDirectory((Path.Combine(My.Application.Info.DirectoryPath, "\Temp")))
    26. build2ProgressBar.Value = +20
    27. 'Daten werden kopiert
    28. My.Computer.FileSystem.CopyFile(Path.Combine(My.Application.Info.DirectoryPath, "Data\CSC\customer.xml"), Path.Combine(My.Application.Info.DirectoryPath, "Temp\customer.xml"), True)
    29. build2ProgressBar.Value = +30
    30. 'Daten werden kopiert
    31. My.Computer.FileSystem.CopyFile( _
    32. Path.Combine(My.Application.Info.DirectoryPath, "Data\CSC\others.xml"), Path.Combine(My.Application.Info.DirectoryPath, "Temp\others.xml"), True)
    33. build2ProgressBar.Value = +40
    34. 'Daten werden kopiert
    35. My.Computer.FileSystem.CopyFile( _
    36. Path.Combine(My.Application.Info.DirectoryPath, "Data\CSC\sales_code.dat"), Path.Combine(My.Application.Info.DirectoryPath, "Temp\sales_code.dat"), True)
    37. build2ProgressBar.Value = +50
    38. 'Daten werden kopiert
    39. My.Computer.FileSystem.CopyDirectory(_Path, _TempPath, True)
    40. build2ProgressBar.Value = +100
    41. MsgBox("Vorgang erfolgreich Abgeschlossen.", MsgBoxStyle.Information)
    42. End Sub
    43. Private Sub clean2Button_Click(sender As System.Object, e As System.EventArgs) Handles clean2Button.Click
    44. 'Verzeichnisstruckturen werden bereinigt
    45. If My.Computer.FileSystem.DirectoryExists(Path.Combine(My.Application.Info.DirectoryPath, "\Solution")) Then
    46. My.Computer.FileSystem.DeleteDirectory(Path.Combine(My.Application.Info.DirectoryPath, "\Solution"), FileIO.DeleteDirectoryOption.DeleteAllContents)
    47. End If
    48. If My.Computer.FileSystem.DirectoryExists(Path.Combine(My.Application.Info.DirectoryPath, "\Temp")) Then
    49. My.Computer.FileSystem.DeleteDirectory(Path.Combine(My.Application.Info.DirectoryPath, "\Temp"), FileIO.DeleteDirectoryOption.DeleteAllContents)
    50. End If
    51. End Sub
    52. End Class
    Bilder
    • Entwurf.png

      11,51 kB, 510×317, 183 mal angesehen

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

    Das mit dem "reinen" Kopieren schaffe ich ja nur wie kann ich mit den Arrays so hantieren, dass er sich die Auswahl merkt?
    Bilder
    • CSC-Creator_Forum.png

      20,46 kB, 487×303, 138 mal angesehen

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

    Das Auslesen ist eine Sache (Ich setzte mich sofort drann) aber, dass er mir nur die verkürzentn Pfade zurück geben soll eine andere.
    Hast du auch dafür eine Lösung? Weil mit den Ganzen Pfaden fannge ich nichts an. (zumindes ohne Scrollbaklen)

    PS (12:10): Die Auswahl die er sich merken soll symbolisieren ja Ordner, die er dann auch kopieren soll!
    Ich sollte mir wirklich angwöhnen, dass ich mich klarer ausdrücke.
    Er ließt den Pfad zum Verzeichniss "x" aus, soll sie die Auswahl=x merken und den Pfad, weil es einfacher zum Lesen ist aber verkürz wiedergeben.
    Ich hoffe ich habe jetzt nciht schon wieder eine Spezifikation vergenssen ansonsten wird der Post heir nochmal editiert. 8|
    Beispiel: Pfad den er ausliest: D:\Projekte\CSC-Creator\CSC-Creator v 9.1.00.0\CSC-Creator v 9.1.00.0\bin\Debug\Data\CSC\ (in diesem Verzeichniss sind Ordner)
    Anzeigen (In der CheckedListBox) Soll er aber nur den Inhalt von CSC\ nicht aber den ganzen Pfad davor. (das ist dass was er jetzt macht)

    Im Screen sieht man, dass man den wert den er mir hier Anzeigt nicht verwenden kann um Produktiv damit zu arbeiten:





    EDIT: \\ 14:48

    Er soll die Ordner die er da darstellen soll aber später mit dem Copy Befehl in ein anderes Verzeichniss kopieren. (nur die die halt ausgewählt worden sind vom User)
    Bilder
    • CSC-Creator_Forum.png

      20,46 kB, 487×303, 123 mal angesehen
    Tja - Trennung von Daten und Gui.

    Als Daten könnteste FileInfo-Objekte nehmen, und die Listbox so einstellen, dass sie nur FileInfo.Name anzeigt, nicht FileInfo.Fullname.

    Auch zum Kopieren sind FileInfos viel praktischer als so depperte Strings, wie man sie von My.Computer.... bekommt.

    Schau dir die FileInfo-Klasse mal im ObjectBrowser an.
    Auf RecursiveFileSearch wird auch damit herumgespielt.
    Ich habe versucht meinen Code dahingehend an zu passen aber es will da nicht laufen und VS schreit mir 100erte Fehler aber ich werd mich mal in das Thema rein knieen.
    PS: Deine "Doku - Such der reihe nach" Threads auf MyCSharp sind nett geschrieben aber wie immer wenn man mehr info rein brinegen will etwas zu langatmig.

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

    Hilfe zur selbsthilfe ....

    Ich hatte/habe versucht mir deine Beiträge zu Herzen zu nehmen und dabei so ab zu änderen, dass sie in meinen Programm Code passen,
    als das fehlschlug, habe ich versucht sie in ein extra Projekt zu packen, doch auch das sollte mir hier nicht helfen, denn:

    Sogar in einem extra Projekt, welches genau auf deine Posts eingeht, funktioniert es nicht.
    Gegebennen Falls bin ich einfach zu blöde zur Umsetztung aber vlt. nicht, egal was oder wer daran Schuld hat, fest steht nur eines:
    Es läuft nicht und ich kann nicht mal den Fehler idendifizieren!
    Dann poste den ganzen Code und schreib, was er tun soll und was er tut. Ansonsten lassen sich Deine Probleme nicht nachvollziehen.
    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!

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub CollectFilesAndFolders( _
    4. ByVal rootDirs As IEnumerable(Of DirectoryInfo), _
    5. ByVal folderCollector As ICollection(Of DirectoryInfo), _
    6. ByVal fileCollector As ICollection(Of FileInfo), _
    7. Optional ByVal pattern As String = "*.*")
    8. 'Vorrausdeklaration der rekursion
    9. Dim recurse As Action(Of IEnumerable(Of DirectoryInfo)) = Nothing
    10. 'rekursion ausprogrammieren
    11. recurse = _
    12. Sub(dirs As IEnumerable(Of DirectoryInfo))
    13. For Each dirinf In dirs
    14. Dim files As IEnumerable(Of FileInfo)
    15. Try
    16. files = dirinf.EnumerateFiles(pattern)
    17. Catch ex As UnauthorizedAccessException
    18. 'für manche Directories hat das Prog keine Rechte
    19. Continue For
    20. End Try
    21. For Each fileInf In files
    22. fileCollector.Add(fileInf)
    23. Next
    24. folderCollector.Add(dirinf)
    25. 'selbst-aufruf
    26. recurse(dirinf.EnumerateDirectories)
    27. Next
    28. End Sub
    29. 'rekursion aufrufen
    30. recurse(rootDirs)
    31. End Sub
    32. Private Sub GetFilesAndFolders(ByVal rootPath As String)
    33. Dim folders As New List(Of DirectoryInfo)
    34. Dim files As New List(Of FileInfo)
    35. Dim rootDirs = {New DirectoryInfo(rootPath)} 'rootDirs enthält hier nur 1 Directory
    36. CollectFilesAndFolders(rootDirs, folders, files)
    37. 'Collect-Ergebnisse verwenden
    38. CheckedListBox1.DataSource = folders
    39. CheckedListBox2.DataSource = files
    40. End Sub
    41. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    42. End Sub
    43. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    44. End Sub
    45. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    46. End Sub
    47. End Class


    Fehler:"EnumerateFiles" ist kein Member von "System.IO.DirectoryInfo".
    Fehler:"EnumerateDirectories" ist kein Member von "System.IO.DirectoryInfo".
    Aufgabe/lenbenszweck ist hier näher und wie ich meine ausführlich beschrieben, für mich jedoch nicht ganz nachvollziebahr.

    Was ich "gerne" zum testen damit bezwecken wollte ist, dass er mir den Inhalt der CheckedListBoxen befüllt und ausliest jedoch sollte er nur die verkürzten Pfade anzeigen! Für weiteres siehe oben.

    IluminatHALO04 schrieb:

    Fehler:"EnumerateFiles" ist kein Member von "System.IO.DirectoryInfo".
    Fehler:"EnumerateDirectories" ist kein Member von "System.IO.DirectoryInfo".
    Ja und?
    Probier doch mal, ein Array zu befüllen mit GetFiles()

    VB.NET-Quellcode

    1. For Each file In System.IO.Directory.GetFiles("c:\Temp", "*.*")
    2. Next
    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!