Copy Directory mit Pfaden in denen sich Umlaute befinden

  • VB.NET

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

    Copy Directory mit Pfaden in denen sich Umlaute befinden

    Hallo,

    ich habe ein Datensicherungsprogramm geschrieben was auch funktioniert.
    Ausser wenn ein Pfad mit "Ü, Ä, Ö, etc" kopiert werden soll.

    Hier mein Code wo ich (glaube) was ändern muss:

    VB.NET-Quellcode

    1. Try
    2. Do While Zahler <> GesamtOrdner
    3. SicherungsItem = ListBoxSicherungsdaten.Items(Zahler)
    4. Dim Info As New System.IO.DirectoryInfo(SicherungsItem)
    5. AktuellerPfad = Speicherplatz & SpeicherDatumString & Info.Name
    6. My.Computer.FileSystem.CreateDirectory(AktuellerPfad)
    7. tbLog.Text = tbLog.Text & vbCrLf & AktuellerPfad & " < Erfolgreich gesichert"
    8. Dim Grosse As Integer
    9. Grosse = Sicherungsdateien.Length
    10. Sicherungsdateien = SicherungsItem
    11. 'Sicherungsdateien - Umlaute müssen in eine andere Codierung gebracht werden . System.Text.Encoding.UTF8 ??
    12. Zahler = Zahler + 1
    13. My.Computer.FileSystem.CopyDirectory(Sicherungsdateien, AktuellerPfad, FileIO.UIOption.AllDialogs)
    14. Loop
    15. Catch ex As Exception
    16. MsgBox("Fehler: " & vbCrLf & ex.Message)
    17. End Try


    Vilen Dank schonmal für hilfe :) :thumbsup:
    Dies funktioniert:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim di = New System.IO.DirectoryInfo("C:\Temp\äöüÄÖÜß\")
    3. di.MoveTo("c:\Temp\ßüöäÜÖÄ\")
    4. End Sub
    Beachte den System.IO-Namespace.
    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!
    Kopiere den Code, die Pfade musste natürlich anpassen.
    Klich auf DirectoryInfo und drück dann auf F1. Da wird Dir geholfen: MSDN.
    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!
    Nein, wird alles korrekt angezeigt und korrekt kopiert, solange ich keine Pfade mit Ü etc habe...


    @ RodfromGermany:

    Habe den Pfad nun so geändert, wie bekomm ich es jetzt hin das er "FileIO.UIOption.AllDialogs" wieder anzeigt (Dateien Überschreiben und Statusbalken wie viel er kopiert hat)

    VB.NET-Quellcode

    1. Try
    2. Do While Zahler <> GesamtOrdner
    3. SicherungsItem = ListBoxSicherungsdaten.Items(Zahler)
    4. Dim Info As New System.IO.DirectoryInfo(SicherungsItem)
    5. AktuellerPfad = Speicherplatz & SpeicherDatumString & Info.Name
    6. My.Computer.FileSystem.CreateDirectory(AktuellerPfad)
    7. tbLog.Text = tbLog.Text & vbCrLf & AktuellerPfad & " < Erfolgreich gesichert"
    8. Dim Grosse As Integer
    9. Grosse = Sicherungsdateien.Length
    10. Sicherungsdateien = SicherungsItem
    11. 'Sicherungsdateien - Umlaute müssen in eine andere Codierung gebracht werden . System.Text.Encoding.UTF8 ??
    12. Zahler = Zahler + 1
    13. Dim di = New System.IO.DirectoryInfo(Sicherungsdateien)
    14. di.MoveTo(AktuellerPfad)
    15. ' My.Computer.FileSystem.CopyDirectory(Sicherungsdateien, AktuellerPfad, FileIO.UIOption.AllDialogs)
    16. Loop
    17. Catch ex As Exception
    18. MsgBox("Fehler: " & vbCrLf & ex.Message)
    19. End Try

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

    Was passier5t, wenn Du mit diesem Code arbeitest:

    VB.NET-Quellcode

    1. ListBox1.Items.AddRange(New IO.DirectoryInfo("c:\Temp\Test").GetDirectories())

    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!
    Nein, also:

    Ich Suche per Button einen Pfad aus und schreibe den Pfad dann in eine ListBox die ich auch abspeichere.

    Dann gebe ich mit dem oben genannten Befehl, jeden Pfad
    in der Listbox
    weiter und kopiere alle Pfade dann in einen neuen Ordner.

    Das kommt jetzt mit dem neuen Codeabschnitt:

    Mit welchem Pfad kommt diese Meldung?
    In welcher Codezeile?
    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!
    @schorge:
    Für Pfade nutz doch bitte path.combine.

    //Edit:
    Offtopic: Übrigends ist das Bild in Deinem Userinterface kein 'Tresor', sondern ein hochwirksames Datenlöschgerät.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „big-d“ ()

    In meiner Schleife mit dem Code hier:

    VB.NET-Quellcode

    1. My.Computer.FileSystem.CopyDirectory(Sicherungsdateien, AktuellerPfad, FileIO.UIOption.AllDialogs)


    Kommt der Fehler das ein Illegales Zeichen im Pfad ist ( also nach dem Bild bei Item(2), da dort ein Ö drin ist)

    Nehme ich den hier vorgeschlagenen Code zum Kopieren:

    VB.NET-Quellcode

    1. Dim di = New System.IO.DirectoryInfo(Sicherungsdateien)
    2. di.MoveTo(AktuellerPfad)


    Kommt wie auf dem Bild der Fehler das er die Datei ersetzen will...


    P.S. das mit dem Tresor bzw. Datenlöschgerät ist mir egal, das Datensicherungsprogramm ist für jemand "älteres" der Ordner einfach sicher - soll - kann ?( ?( ^^

    Object Browser schrieb:

    System.IO.IOException: An attempt was made to move a directory to a different volume. -or-destDirName already exists.-or-You are not authorized to access this path.-or- The directory being moved and the destination directory have the same name.
    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!
    Sorry, aber ich komme bei dem Punkt irgendwie nicht weiter :(

    Hab das jetzt mal so gemacht, kommt aber immernoch "Illegales Zeichen"

    VB.NET-Quellcode

    1. If System.IO.Directory.Exists(Sicherungsdateien) Then
    2. MsgBox("Die Dateien sind schon vorhanden")
    3. Else : di.MoveTo(AktuellerPfad)
    4. End If

    schorge schrieb:

    kommt aber immernoch "Illegales Zeichen"
    Welches Zeichen bei welchem Befehl?
    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!
    In Zeile 65 gibt er den Fehler aus mit Illegalem Zeichen:

    Habe noch etwas "rumgebastelt" sodass mit meiner Funktion
    CleanFilename in Zeile 56 alle Umlaute durch "" ersetzt werden, aber das geht auch nicht, kommt trotzdem
    Illegales Zeichen .... :wacko:



    VB.NET-Quellcode

    1. Private Sub btSichern_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim SpeicherortDialog As New FolderBrowserDialog
    3. Dim AktuellerPfad As String
    4. Dim Gesamtzahler As Integer
    5. Dim Zahler As Integer
    6. Dim GesamtOrdner As Integer
    7. Dim SicherungsItem As String
    8. Speicherdatum = Date.Today
    9. SpeicherortDialog.ShowNewFolderButton = False
    10. SpeicherortDialog.Description = "Bitte Externe Festplatte auswählen"
    11. If SpeicherortDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
    12. SpeicherortDialog.RootFolder = Environment.SpecialFolder.MyComputer
    13. Speicherplatz = SpeicherortDialog.SelectedPath
    14. tbStandartSpeicherPfad.Text = Speicherplatz
    15. GesamtOrdner = ListBoxSicherungsdaten.Items.Count
    16. Sicherungsdateien = ListBoxSicherungsdaten.Items(0)
    17. Gesamtzahler = 0
    18. Zahler = 0
    19. SpeicherDatumString = "\" & Speicherdatum & "\"
    20. REM My.Computer.FileSystem.CreateDirectory(Speicherplatz & SpeicherDatumString)
    21. Try
    22. Do While Zahler <> GesamtOrdner
    23. SicherungsItem = ListBoxSicherungsdaten.Items(Zahler)
    24. Dim Info As New System.IO.DirectoryInfo(SicherungsItem)
    25. AktuellerPfad = Speicherplatz & SpeicherDatumString & Info.Name
    26. My.Computer.FileSystem.CreateDirectory(AktuellerPfad)
    27. tbLog.Text = tbLog.Text & vbCrLf & AktuellerPfad & " < Erfolgreich gesichert"
    28. Dim Grosse As Integer
    29. Grosse = Sicherungsdateien.Length
    30. Sicherungsdateien = SicherungsItem
    31. 'Sicherungsdateien - Umlaute müssen in eine andere Codierung gebracht werden . System.Text.Encoding.UTF8 ??
    32. Zahler = Zahler + 1
    33. 'Dim di = New System.IO.DirectoryInfo(Sicherungsdateien)
    34. 'If System.IO.Directory.Exists(Sicherungsdateien) Then
    35. 'MsgBox("Die Dateien sind schon vorhanden")
    36. 'Else : di.MoveTo(AktuellerPfad)
    37. 'End If
    38. Dim SicherungsdateinOu As String
    39. SicherungsdateinOu = CleanFilename(Sicherungsdateien, sChar:="_")
    40. Sicherungsdateien = SicherungsdateinOu
    41. My.Computer.FileSystem.CopyDirectory(Sicherungsdateien, AktuellerPfad, FileIO.UIOption.AllDialogs)
    42. Loop
    43. Catch ex As Exception
    44. MsgBox("Fehler: " & vbCrLf & ex.Message)
    45. End Try
    46. MsgBox("Die Dateien" & vbCrLf & Sicherungsdateien & vbCrLf & "wurden erfolgreich gespeichert")
    47. Else : MsgBox("Fehler!")
    48. End If
    49. End Sub
    50. ''' <summary>
    51. ''' Ersetzt alle nicht zulässigen Zeichen im angegebenen Dateinamen
    52. ''' </summary>
    53. ''' <param name="sFilename">Dateiname ohne Pfadangabe</param>
    54. ''' <param name="sChar">Ersatzzeichen für alle unzulässigen Zeichen
    55. ''' im Dateinamen</param>
    56. Public Function CleanFilename(ByVal sFilename As String, _
    57. Optional ByVal sChar As String = "") As String
    58. ' alle nicht zulässigen Zeichen ersetzen
    59. Return System.Text.RegularExpressions.Regex.Replace( _
    60. sFilename, "[ßüöäÜÖÄ]", sChar)
    61. End Function