Daten splitten

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von xtts02.

    Daten splitten

    Hei. Ich habe wirklich schon sehr viele Foren durchsucht und bisher noch nichts passendes gefunden.

    Mein Ziel ist es ein sogenannten File-Splitter zu erstellen, bei dem man folgende Dinge wählen kann.

    -Quellpfad
    -Zielpfad
    -Wie viele Verzeichnisse
    -Neuer Verzeichnisname

    das sieht so aus:



    danach kann man folgende Dinge auswählen und entscheiden:



    Klickt man nun auf Splitten funktioniert das Programm folgendermassen:

    -Es berechnet die Anzahl Dateien
    -Es erstellt das neue Verzeichnis (genau 4 Ordner in diesem Beispiel)
    -Es berechnet ebenfalls die Dateien die in je einen Ordner sollen

    Anzahl Ordner: 4
    Anzahl Dateien im Quellpfad: 30

    Dateien pro Ordner = 6

    Leider kopiert es jetzt in jedes neue Verzeichnis den gesamten Quellpfad.
    Wie schaffe ich es das es in den ersten Ordner die ersten 6 (in diesem beispiel)
    in den zweiten Ordner die zweiten 6 etc.

    So das am Schluss alle Dateien in den vier Ordner verteilt sind.
    Hoffe auf Hilfe. (habe mir Mühe gegeben es verständlich zu schreiben)
    Hoffe auf Hilfe. (habe mir Mühe gegeben es verständlich zu schreiben)
    Im Moment wird es wohl eher schwierig dir zu helfen. Dein Quellcode (oder auch nur ein Ausschnitt) wäre genz nützlich, um dir zu helfen. Probier vielleicht noch einmal dein genaues Problem zu formulieren.
    Also der wichtigste Code befindet sich ja beim Splitten Button. Das wäre der Code.


    VB.NET-Quellcode

    1. //Hier zählt es die Anzahl Datein des Quellpfad (steht in der Textbox1)
    2. Dim counter As _
    3. System.Collections.ObjectModel.ReadOnlyCollection(Of String)
    4. counter = My.Computer.FileSystem.GetFiles(TextBox1.Text)
    5. TextBox3.Text = counter.Count
    6. If IsNumeric(TextBox4.Text) Then
    7. //Hier wird eine Zahl daraus gemacht und an die Textbox 6 weitergegeben ( das ist die unten Links)
    8. Dim y As Double = CDbl(TextBox4.Text) 'oder Convert.ToDouble(Textbox1.Text)
    9. TextBox6.Text = y.ToString
    10. //Anzahl Datein pro Ordner werden so berechnet
    11. TextBox6.Text = counter.Count / y.ToString
    12. //Hier erstellt es die Ordner (richtige Anzahl)
    13. 1: If y.ToString > 0 Then
    14. My.Computer.FileSystem.CreateDirectory _
    15. (TextBox2.Text & "\" & TextBox5.Text & y.ToString)
    16. TextBox7.Text = TextBox2.Text & "\" & TextBox5.Text & y.ToString
    17. My.Computer.FileSystem.CopyDirectory(TextBox1.Text, TextBox7.Text, True)
    18. y = y - 1
    19. GoTo 1
    20. Else
    21. End If
    22. End If

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

    Habe vor kurzem auch so 'was gebraucht und mir schnell 'was zusammengebastelt ...
    Frei nach dem Motto: "Kommentare sind 'was für Weicheier ... :P
    Hoffe, dass man es so auch nachvollziehen kann ...

    VB.NET-Quellcode

    1. Private Sub SplittFolder(ByVal srcFolder As String, ByVal targetFolder As String, _
    2. ByVal subFolderName As String, ByVal filesEachSubfolder As Integer)
    3. If Not Directory.Exists(srcFolder) Then
    4. MessageBox.Show("Quellverzeichnis nicht vorhanden ...", "SplittFolder", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    5. Return
    6. End If
    7. Dim fileList As List(Of FileInfo) = (From fi As FileInfo In _
    8. New DirectoryInfo(srcFolder).GetFiles("*.*", SearchOption.TopDirectoryOnly) _
    9. Order By fi.FullName Select fi).ToList
    10. Dim dirIndex As Integer = 0
    11. Dim fileIndex As Integer = 0
    12. Dim targetDir As String
    13. Dim targetFi As FileInfo
    14. For Each srcFi As FileInfo In fileList
    15. If fileIndex Mod filesEachSubfolder = 0 Then dirIndex += 1
    16. targetDir = Path.Combine(targetFolder, subFolderName & dirIndex.ToString("000"))
    17. targetFi = New FileInfo(Path.Combine(targetDir, srcFi.Name))
    18. If Not targetFi.Directory.Exists Then
    19. Try
    20. targetFi.Directory.Create()
    21. Catch ex As Exception
    22. MessageBox.Show(ex.Message, "Verzeichnis erstellen ...", MessageBoxButtons.OK, MessageBoxIcon.Error)
    23. End Try
    24. End If
    25. Try
    26. srcFi.CopyTo(targetFi.FullName, True)
    27. Catch ex As Exception
    28. MessageBox.Show(ex.Message, ("Kopieren ..."), MessageBoxButtons.OK, MessageBoxIcon.Error)
    29. End Try
    30. fileIndex += 1
    31. Next
    32. End Sub

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. If Not Directory.Exists(srcFolder) Then
    4. MessageBox.Show("Quellverzeichnis nicht vorhanden ...", "SplittFolder", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    5. Return
    6. End If
    7. Dim fileList As List(Of FileInfo) = (From fi As FileInfo In _
    8. New DirectoryInfo(srcFolder).GetFiles("*.*", SearchOption.TopDirectoryOnly) _
    9. Order By fi.FullName Select fi).ToList
    10. Dim dirIndex As Integer = 0
    11. Dim fileIndex As Integer = 0
    12. Dim targetDir As String
    13. Dim targetFi As FileInfo
    14. For Each srcFi As FileInfo In fileList
    15. If fileIndex Mod filesEachSubfolder = 0 Then dirIndex += 1
    16. targetDir = Path.Combine(targetFolder, subFolderName & dirIndex.ToString("000"))
    17. targetFi = New FileInfo(Path.Combine(targetDir, srcFi.Name))
    18. If Not targetFi.Directory.Exists Then
    19. Try
    20. targetFi.Directory.Create()
    21. Catch ex As Exception
    22. MessageBox.Show(ex.Message, "Verzeichnis erstellen ...", MessageBoxButtons.OK, MessageBoxIcon.Error)
    23. End Try
    24. End If
    25. Try
    26. srcFi.CopyTo(targetFi.FullName, True)
    27. Catch ex As Exception
    28. MessageBox.Show(ex.Message, ("Kopieren ..."), MessageBoxButtons.OK, MessageBoxIcon.Error)
    29. End Try
    30. fileIndex += 1
    31. Next
    32. End Sub
    33. End Class


    Besten Dank für deine Hilfe.
    So sieht der momentane Code von mir aus.

    Dabei kommen folgende Fehlermeldungen: Directory und FileInfo wurden nicht deklariert.
    Wie muss ich diese Deklarieren damit das Programm funktionsfähig wird?
    Okei aber gibt es eine Möglichkeit die Dateien in einem Ordner zu zählen und danach kopieren.
    Also man hat so etwas:

    VB.NET-Quellcode

    1. counter = My.Computer.FileSystem.GetFiles(TextBox1.Text)


    Eine For schlaufe wobei es nur die ersten 6 Dateien des Ordnerinhaltes kopiert?

    VB.NET-Quellcode

    1. For Each wert As TypeDesArrays In DerArray
    2. 'wert ist dabei das Element, welches aktuell aus der Liste ausgelesen wird...
    3. Next
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Verstehe das nicht ganz.
    Ich habe es ja mit einer Listbox gemacht.

    Die erste Datei hole ich so:

    Dim arrayZähler as Integer = 0
    Listbox1.items.item(arrayZähler) ==> jetzt gibt es die erste Datei aus, z.B Bild.png

    danach erhöhe ich den arrayZähler um 1 und es gibt die zweite Datei aus .

    Wie kann ich jetzt diesen Pfad der Listbox (z.B U:\Quelle\Bild.png in ein neues Verzeichnis kopieren??

    VB.NET-Quellcode

    1. For Each item As String In ListBox.Items'hiermit durchläufst du die gesamte ListBox
    2. 'item ist der aktulle Wert...
    3. Next

    kopieren geht doch mit System.IO.File.Copy(wurde bereits gepostet)...
    bei Copy wird nicht nur das neue Verzeichnis benötigt, sondern auch noch dahinter der Dateinamen der Datei, verknüpfen kannst du es mit System.IO.Path.Combine...

    außerdem: vbarchiv.net/forum/id22_i72073t72073_vb-daten-splitten.html -> :P
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Okei ich bin jetzt auf bestem Weg um meinen File-Splitter endlich fertig zu haben.

    Ich habe noch eine Frage:

    Wenn das hier mein Pfad ist: U:\Quelle\Quellen\Bild.png

    wie kann ich den Pfad so removen oder reduzieren das es nur noch den Dateinamen anzeigt.
    also Bild.png!
    Wichtig! Der Pfad kann Variabel sein, also auch nur U:\Bild.png heissen ;)
    Also ich bin von meinen Ferien zurück :D

    Weiter gehts....

    Mein aktueller Stand:

    VB.NET-Quellcode

    1. For Each item As String In ListBox1.Items
    2. Dim quelle As String = item
    3. MsgBox(System.IO.Path.GetFileName(item))
    4. Next


    Ich hole alle Dateien und gebe Sie in einer Message Box zur überprüfung wieder aus.
    Ist es jetzt nicht möglich (oder bin ich einfach nicht fähig dazu) die Dateien zu kopieren???

    Also ein Item in dieser Listbox ist zum Beispiel Neu Bitmap.bmp
    Wie kann ich das in den Pfad kopieren, welcher in einer Textbox steht z.B U:\Ziel\und dann hier diese Bitmap Datei hin ?????

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

    Kopieren geht mit IO.File.Copy (quellDatei, zielDatei), wobei quellDatei und zielDatei absolute Pfade sind. D.H, vollständiger Pfad mit Verzeichnisangabe u.s.w.
    Beispiel:

    VB.NET-Quellcode

    1. Dim newDir As String = "X:\NeuerOrdner"
    2. For Each itm As String In ListBox1.Items
    3. ' Dateiname aus dem absoluten Pfad holen
    4. Dim fileName As String = IO.Path.GetFileName(itm)
    5. ' Neuer absoluter Pfad aus neuem Verzeichnis und Dateinamen bilden
    6. Dim newPath As String = IO.Path.Combine(newDir, fileName)
    7. ' Datei kopieren
    8. IO.File.Copy(itm, newPath)
    9. Next
    Danke für die Antwort.
    Ich habe es noch ein wenig ausgebessert.

    VB.NET-Quellcode

    1. For Each item As String In ListBox1.Items
    2. Dim fileName As String = IO.Path.GetFileName(item)
    3. IO.File.Copy(item, TextBox9.Text)
    4. Next


    Das hier sind die Werte die in meinem Test vorgekommen sind:

    item = "U:\Quelle\Neu Bitmap.bmp"
    textbox9.text = "U:\Ziel\NeuerOrder\"

    Wieso funktioniert das jetzt nicht wenn ich diese Neu Bitmap.bmp Datei in das neue Verzeichniss U:\Ziel\NeuerOrder\ kopieren will..
    also dann so etwas habe: U:\Ziel\NeuerOrder\Neu Bitmap.bmp

    Habe es auch schon mit combine funktioniert komm aber einfach nicht drauf. Kein Plan mehr :whistling: