Kopieren von Dateien in individuellen Unterordnern

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Kopieren von Dateien in individuellen Unterordnern

    Hey Leute,

    ich hab ein Problem und komm echt nicht mehr weiter, und zwar versuche ich aus einem unbestimmten Ordner die Dateien, dieUnterordner,sowie die Dateien der Unterordner zu kopieren. Ich habe derzeit folgenden Code:

    VB.NET-Quellcode

    1. Private Function OrdnerKopieren()
    2. Dim DirInfo As New DirectoryInfo(SourcePath)
    3. Dim Directories As List(Of DirectoryInfo) = DirInfo.GetDirectories.ToList
    4. Dim Files As List(Of FileInfo) = DirInfo.GetFiles.ToList
    5. For Each oDir As DirectoryInfo In Directories
    6. Dim NewDestinationPath As String = Path.Combine(DestinationPath, oDir.Name)
    7. If Not Directory.Exists(NewDestinationPath) Then
    8. Directory.CreateDirectory(NewDestinationPath)
    9. End If
    10. Next
    11. For Each oFile As FileInfo In Files
    12. Dim NewFilename As String = Path.Combine(DestinationPath, oFile.Name)
    13. File.Copy(oFile.FullName, NewFilename)
    14. Next
    15. For Each oDir As DirectoryInfo In Directories
    16. Dim DirSubPath As New DirectoryInfo(Path.Combine(DestinationPath, oDir.Name))
    17. Dim SubFile As List(Of FileInfo) = DirSubPath.GetFiles.ToList
    18. For Each soFile As FileInfo In SubFile
    19. Dim NewSubFilename As String = Path.Combine(DestinationPath & oDir.Name, soFile.Name)
    20. File.Copy(soFile.FullName, NewSubFilename)
    21. Next
    22. Next
    23. Console.ReadLine()
    24. End Function


    Wenn ich das Programm teste, bekomme Ich nicht die Dateien kopiert, die in den Unterordnern sind.
    Bitte um Hilfe.

    LG
    Setze in Dein Programm einen Haltepunkt (F9) rein. Steppe mit F10 von Befehl zu befehl.
    Klicke auf eine Variable und drücke Shift+F9, da wird sie Dir angezeigt.
    Nun musst Du nur noch überprüfen, on in den Variablen das drinsteht, was Du glaubst, dass drinstehen soll. Wenn nicht, hast Du den Fehler gefunden. :thumbup:
    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!
    Spoiler anzeigen

    VB.NET-Quellcode

    1. #Region "Syncronisation Teil 1:"
    2. ' Ordner erstellen, Dateien löschen, Dateien ändern, neue Dateien erstellen
    3. Public Sub CopyFolder_Sync(ByVal sSrcPath As String, ByVal sDestPath As String)
    4. ' Falls Zielordner nicht existiert, jetzt erstellen
    5. If Not Directory.Exists(sDestPath) Then
    6. Directory.CreateDirectory(sDestPath)
    7. End If
    8. ' Reihenfolge:
    9. ' 1. Löschen (damit das, was gelöscht werden muss, schon mal weg ist
    10. ' und nicht zum Vergleichen für die Änderungen herangezogen werden
    11. ' muss -> spart Zeit!)
    12. ' 2. Ändern (erst in Frage kommende Dateien ändern, dann Dateien, die
    13. ' neu erstellt werden müssen, neu erstellen, weil sonst auch die neu
    14. ' erstellten Dateien beim Vergleich der Änderungen mit geprüft
    15. ' würden -> spart Zeit!)
    16. ' 3. Neue Dateien erstellen
    17. ' Alle Dateien des Ziel-Ordners LÖSCHEN, die nicht im
    18. ' Quell-Ordner vorhanden sind:
    19. 'Dateien_Im_Zielordner_Löschen(sSrcPath, sDestPath)
    20. ' Alle Dateien des Ziel-Ordners ÄNDERN durch Löschen und Kopieren,
    21. ' die im Quell-Ordner mit einem anderen Änderungsdatum vorhanden sind:
    22. Dateien_Im_Zielordner_Ändern(sSrcPath, sDestPath)
    23. ' Alle Dateien im Ziel-Ordner ERSTELLEN, die dort fehlen:
    24. Dateien_Im_Zielordner_Erstellen(sSrcPath, sDestPath)
    25. ' Jetzt alle Unterordner ermitteln und die CopyFolder-Sub
    26. ' rekursiv(aufrufen)
    27. Dim sDirs() As String = Directory.GetDirectories(sSrcPath)
    28. Dim sDir As String
    29. For i As Integer = 0 To sDirs.Length - 1
    30. If sDirs(i) <> sDestPath Then
    31. sDir = sDirs(i).Substring(sDirs(i).LastIndexOf("\") + 1)
    32. CopyFolder_Sync(sDirs(i).ToString & "\", sDestPath & sDir & "\")
    33. End If
    34. Next i
    35. End Sub
    36. Private Sub Dateien_Im_Zielordner_Löschen(ByVal sSrcPath As String, _
    37. ByVal sDestPath As String)
    38. Dim sFiles() As String = Directory.GetFiles(sDestPath)
    39. Dim sFile As String
    40. For i As Integer = 0 To sFiles.Length - 1
    41. sFile = sFiles(i).Substring(sFiles(i).LastIndexOf("\") + 1)
    42. If Not File.Exists(sSrcPath & sFile) Then
    43. File.Delete(sDestPath & sFile)
    44. End If
    45. Next i
    46. End Sub
    47. Private Sub Dateien_Im_Zielordner_Ändern(ByVal sSrcPath As String, _
    48. ByVal sDestPath As String)
    49. Dim sFiles() As String = Directory.GetFiles(sDestPath)
    50. Dim sFile As String
    51. For i As Integer = 0 To sFiles.Length - 1
    52. sFile = sFiles(i).Substring(sFiles(i).LastIndexOf("\") + 1)
    53. If File.Exists(sSrcPath & sFile) Then
    54. Dim DestFile As New FileInfo(sDestPath & sFile)
    55. Dim SrcFile As New FileInfo(sSrcPath & sFile)
    56. If DestFile.LastWriteTime <> SrcFile.LastWriteTime Then
    57. File.Delete(sDestPath & sFile)
    58. File.Copy(sSrcPath & sFile, sDestPath & sFile)
    59. ListBox4.Items.Add(sFile)
    60. End If
    61. End If
    62. Next i
    63. Panel4.Show()
    64. End Sub
    65. Private Sub Dateien_Im_Zielordner_Erstellen(ByVal sSrcPath As String, _
    66. ByVal sDestPath As String)
    67. Dim sFiles() As String = Directory.GetFiles(sSrcPath)
    68. Dim sFile As String
    69. ProgressBar1.Maximum = sFiles.Length
    70. For i As Integer = 0 To sFiles.Length - 1
    71. sFile = sFiles(i).Substring(sFiles(i).LastIndexOf("\") + 1)
    72. If Not File.Exists(sDestPath & sFile) Then
    73. File.Copy(sSrcPath & sFile, sDestPath & sFile)
    74. ListBox4.Items.Add(sFile)
    75. End If
    76. ProgressBar1.Value = i
    77. Next i
    78. ProgressBar1.Value = sFiles.Length
    79. Button_Synchronisieren.Enabled = True
    80. Label4.Text = "Es wurden " & ListBox4.Items.Count & vbNewLine & "Daten aktualisiert!"
    81. Panel4.BringToFront()
    82. ListBox4.BringToFront()
    83. Label4.BringToFront()
    84. End Sub
    85. #End Region
    86. #Region "Syncronisation Teil 2:"
    87. ' Ordner im Ziel löschen, wenn es sie in der Quelle nicht gibt"
    88. Public Sub DeleteFolder_Sync(ByVal sSrcPath As String, _
    89. ByVal sDestPath As String)
    90. ' Falls Zielordner in der Quelle nicht existiert,
    91. ' jetzt im Ziel löschen:
    92. If Not Directory.Exists(sSrcPath) Then
    93. Directory.Delete(sDestPath, True)
    94. End If
    95. ' Jetzt alle Unterordner ermitteln und die
    96. ' DeleteFolder-Sub rekursiv aufrufen:
    97. Try
    98. Dim sDirs() As String = Directory.GetDirectories(sDestPath)
    99. Dim sDir As String
    100. For i As Integer = 0 To sDirs.Length - 1
    101. If sDirs(i) <> sSrcPath Then
    102. sDir = sDirs(i).Substring(sDirs(i).LastIndexOf("\") + 1)
    103. DeleteFolder_Sync(sSrcPath & sDir & "\", sDirs(i).ToString & "\")
    104. End If
    105. Next i
    106. Catch ex As Exception
    107. End Try
    108. End Sub
    109. #End Region


    Code ist nicht von mir ! Hatte ich mal in mein eigenes Prog. eingebaut :thumbsup:
    Klasse. C&P-Code, der nicht verstanden wird und nur noch mehr Fragen aufwirft. :thumbdown:
    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!
    Hey RodFromGermany,

    Danke, das hat mir echt geholfen, den ich habe bemerkt, das bei der Variable 'SubDirPath' die Quellenangabe mit der Zielangabe vertauscht wurde:

    VB.NET-Quellcode

    1. For Each oDir As DirectoryInfo In Directories
    2. Dim DirSubPath As New DirectoryInfo(Path.Combine(SourcePath, oDir.Name)) // vorher war es DestinationPath
    3. Dim SubFile As List(Of FileInfo) = DirSubPath.GetFiles.ToList // Deshalb war SubFile: Count = 0
    4. For Each soFile As FileInfo In SubFile
    5. Dim NewSubFilename As String = Path.Combine(DestinationPath & "\" & oDir.Name, soFile.Name)
    6. File.Copy(soFile.FullName, NewSubFilename)
    7. Next
    8. Next

    bluray schrieb:

    Danke, das hat mir echt geholfen

    Dann drücke den Hilfreich-Button und schließe den Thread mit Erledigt. :thumbup:
    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!