Ordner Ersetzen?!?

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

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Fortender.

    Ordner Ersetzen?!?

    Hallo!

    Mein Problem lautet wie folgt:

    Wenn ich einen Ordner durch:

    Visual Basic-Quellcode

    1. System.IO.Directory.CreateDirectory(SaveFileDialog1.FileName)
    2. My.Computer.FileSystem.CopyDirectory("pfad1", SaveFileDialog1.FileName, True)

    erstelle, danach am selben Pfad wieder, wird anstatt dass der andere Ordner mit dem selben Namen ersetzt wird, der neue Ordner in den anderen eingefügt.
    Was muss ich ändern dass der Ordner + Ordnerinhalt ersetzt wird oder einfach gelöscht + neu erstellt?
    Probiere mal Folgendes ist jetzt fix aus dem Rippen geschnitten ;)

    VB.NET-Quellcode

    1. Dim SFD as new SaveFileDialog
    2. Public Sub Button_Event()
    3. with SFD
    4. 'Optionen für deinen SFD
    5. .InitialDirectory = "C:/"
    6. .ShowDialog()
    7. end with
    8. Try
    9. IO.Directory.CreateDirectory(SaveFileDialog1.FileName)
    10. Catch ex As Exception
    11. MessageBox.show(ex.toString)
    12. End Try
    13. 'Delete
    14. IO.Directory.Delete(SaveFileDialog1.FileName)
    15. 'Create
    16. IO.Directory.CreateDirectory("Neuer Pfad")
    17. end sub


    Du könntest auch den neuen Ordner erstellen alle Daten darein Kopieren dann den Alten löschen.

    LG
    Hm, funktioniert nicht so ganz.

    Ich habs auch schon versucht mit:

    Visual Basic-Quellcode

    1. ​If Directory.Exists(SaveFileDialog1.FileName) = True Then
    2. IO.Directory.Delete(SaveFileDialog1.FileName)
    3. IO.Directory.CreateDirectory(SaveFileDialog1.FileName)
    4. My.Computer.FileSystem.CopyDirectory("C:\Users\" & Richtigerbenutzername & "\Desktop\test", SaveFileDialog1.FileName, True)
    5. End If
    Was das Programm machen soll ist ganz einfach, es erstellt einen Ordner (z.b am Desktop) in diesen dann Daten hineinkopiert werden.
    Also ein Backup.
    Das Problem ist nur, wenn ich schon ein Backup (also den Ordner mit Datein drin) erstellt habe, daraufhin noch mal auf "Backup" klicke, soll das Alte Backup (der Ordner) gelöscht werden und nochmal erstellt.(CreateDirectory & CopyDirectory)
    Was aber jetzt passiert ist, es wird der Neue Backup-Ordner in den alten hineingefügt weil sie beide den selben Namen haben.

    P.s Das ist der Code fürs kopieren von Daten von einem Ordner in einen anderen:

    Visual Basic-Quellcode

    1. ​My.Computer.FileSystem.CopyDirectory("DatenPfad, ZielPfad, True)
    Dann benutzte einen FolderBrowserDialog, wähle deinen backup Ordner und danach dein Code zum Kopiern/löschen.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. With FolderBrowserDialog1
    3. .ShowDialog()
    4. End With
    5. If IO.Directory.Exists(FolderBrowserDialog1.SelectedPath) = True Then
    6. Dim GetOldFolderName As IO.DirectoryInfo
    7. Dim oldpath As String = FolderBrowserDialog1.SelectedPath
    8. GetOldFolderName = New IO.DirectoryInfo(oldpath)
    9. Dim oldname As String = GetOldFolderName.Name
    10. IO.Directory.CreateDirectory(oldpath & "_")
    11. 'Daten in Ordner Kopieren
    12. For Each s As String In IO.Directory.GetFiles(oldpath)
    13. IO.File.Copy(s, oldpath & "_/" & IO.Path.GetFileName(s))
    14. Next
    15. For Each s As String In IO.Directory.GetFiles(oldpath)
    16. IO.File.Delete(s)
    17. Next
    18. IO.Directory.Delete(oldpath)
    19. My.Computer.FileSystem.RenameDirectory(oldpath & "_", oldname)
    20. Else
    21. End If
    22. End Sub


    So habe ich das nun gelöst sollte dir Helfen ;)
    @Keybladmaster
    Bitte überarbeite deinen Code nochmal. Sowohl logisch als auch stylistisch.
    Das With da oben is so unnötig wie dem Papst sei Klöten
    Besser wäre das Ganze mit Using zu machen:

    VB.NET-Quellcode

    1. Using fbd As New FolderBrowserDialog
    2. If fbd.ShowDialog = DialogResult.OK Then
    3. Dim _dir = New IO.DirectoryInfo(fbd.SelectedPath)
    4. Try
    5. If _dir.Exists() Then _dir.Delete()
    6. _dir.Create()
    7. 'Dann wie gewohnt die Dateien reinkopieren
    8. 'Dafür haste ja scheinbar schon code TE
    9. Catch ex As UnauthorizedAccessException
    10. MessageBox.Show(Me, "Kein Zugriff. \nFehler:" & ex.Message, "Fehler")
    11. End Try
    12. End If
    13. End Using

    Code mit dem Handy getippt und ausm Kopf ohne IntelliSense :P
    Fehler dürfen behalten und korrigiert werden.

    MfG Tim

    luigil1000 schrieb:

    Visual Basic-Quellcode

    1. System.IO.Directory.CreateDirectory(SaveFileDialog1.FileName)
    2. My.Computer.FileSystem.CopyDirectory("pfad1", SaveFileDialog1.FileName, True)
    erstelle, danach am selben Pfad wieder, wird anstatt dass der andere Ordner mit dem selben Namen ersetzt wird, der neue Ordner in den anderen eingefügt.
    Naja, wenn du mit einem FileDialog einen Ordner suchst, dann wirst du einen FilePath finden, keinen Ordner-Path.
    Hats einen Grund, dass du keinen FolderBrowser-Dialog verwendest?
    @ErfinderDesRades
    Er hat sich ja dann noch verbessert.
    Hast du mal versucht mit einem SaveFileDialog einen Ordner zu speichern? Geht nicht.. Sobald man einen Ordner auswählt bleibt einem nur die Möglichkeit zu diesem zu navigieren.
    File =/= Directory daher auch keine Möglichkeit eine Directory in den SelectedFile a.k.a FileName zu quetschen.

    Ich hab ja schon einen möglichen Ansatz gegeben. Den Ordner löschen, neu erstellen und dann die Daten direkt in dem Ordner erstellen ohne dass eine rekursive Methode zum Kopieren über schreiben usw gebraucht wird.

    Keybladmaster schrieb:

    @Fortender

    Das war auch nur fix dahin geschrieben von handy, sry dafür ;)

    LG

    Da waren aber Fehler drin, die dir die IntelliSense auch nicht verbessert hätte. Ich spreche von syntaktischen Fehlern ;)

    MfG Tim
    Also viel mehr stylistische Fehler. Syntaktisch war das falsche Stichwort.
    Ich verweise auf den 6. Post.

    Keybladmaster schrieb:

    VB.NET-Quellcode

    1. With FolderBrowserDialog1
    2. .ShowDialog()
    3. End With

    Einen With-Block verwendet man normalerweise um code zu sparen. Hier ist das Gegenteil der Fall. So wie ich das sehe
    hast du auch den FolderBrowserDialog auf die Form gezogen. Besser wäre meiner Meinung nach das Ganze mit
    Using zu realisieren:

    VB.NET-Quellcode

    1. Using fbd As New FolderBrowserDialog
    2. If fbd.ShowDialog = DialogResult.OK Then
    3. 'Code
    4. End If
    5. End Using

    Keybladmaster schrieb:

    VB.NET-Quellcode

    1. If IO.Directory.Exists(FolderBrowserDialog1.SelectedPath) = True Then

    Exists ist in dem Fall eine Funktion mit Übergabe -und Rückgabeparameter. Als Rückgabeparameter erhält man einen Boolean.
    Bei einer If-Abfrage eines Booleans muss nicht ein erneuter Vergleich durchgeführt werden, sondern man kann diesen direkt auswerten lassen.
    Das '= True' ist also hinfällig. Würdest du überprüfen wollen ob das False ist, dann könntest du vor den Boolean 'Not' anhängen.
    In manchen Programmiersprachen scheint sowas ignoriert zu werden, aber ich denke rein von der Logik her würde es ansonsten einen erneuten Vergleich durchführen, was
    wiederrum umsonst rechnen lässt.

    Beispiel:

    VB.NET-Quellcode

    1. Dim b As Boolean = 3 < 5 'Meckert nicht über die Variabelnamen :P
    2. If b = True Then 'In Ordnung
    3. If b Then 'Besser
    4. Dim bb As Boolean = 3 > 5
    5. If bb = False Then 'In Ordnung
    6. If Not bb Then 'Besser



    Keybladmaster schrieb:


    VB.NET-Quellcode

    1. Dim GetOldFolderName As IO.DirectoryInfo
    2. Dim oldpath As String = FolderBrowserDialog1.SelectedPath
    3. GetOldFolderName = New IO.DirectoryInfo(oldpath)
    4. Dim oldname As String = GetOldFolderName.Name
    5. IO.Directory.CreateDirectory(oldpath & "_")
    6. 'Daten in Ordner Kopieren
    7. For Each s As String In IO.Directory.GetFiles(oldpath)
    8. IO.File.Copy(s, oldpath & "_/" & IO.Path.GetFileName(s))
    9. Next
    10. For Each s As String In IO.Directory.GetFiles(oldpath)
    11. IO.File.Delete(s)
    12. Next
    13. IO.Directory.Delete(oldpath)
    14. My.Computer.FileSystem.RenameDirectory(oldpath & "_", oldname)

    Hier werden auch ziemlich viel Codezeilen verwendet für zwei, drei kleine Operationen. Mein Informatiklehrer hat immer gesagt,
    kein Problem wenn es der Übersicht dient, aber hier denke ich ist eher Überfluss der Fall.
    Warum nicht einfach:

    VB.NET-Quellcode

    1. Dim _dir As New IO.DirectoryInfo(fbd.SelectedPath)
    2. Try
    3. _dir.Delete(True)
    4. _dir.Create()
    5. 'Code zum erstellen des Backups im angegebenen Ordner
    6. Catch ex As UnauthorizedAccessException
    7. MessageBox.Show(Me, "Datenzugriff gescheitert, bla.", "Fehlermeldung")
    8. End Try

    Er wollte soweit ich weiß einfach nur das alte Backup löschen, dann den Ordner wieder erstellen und dann direkt in den
    erstellten Ordner ein Backup durchführen.
    Falls ich in meinem geistigen Dünnschiss Fehler untergebracht habe, lasst es mich wissen.

    MfG Tim

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Fortender“ ()