VB Datei verschieben und ggf. ersetzen oder umbenennen

  • VB.NET

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

    VB Datei verschieben und ggf. ersetzen oder umbenennen

    Hallo,

    mir ist bekannt, dass ich mit:

    VB.NET-Quellcode

    1. My.Computer.FileSystem.MoveFile(quelle, ziel, True)


    Dateien verschieben und ersetzen kann.

    Jetzt habe ich aber mal eine andere Frage, wie schafft man es, dass hier eine Abfrage kommt?
    Gemäß dem Motto: Möchten sie die Datei ersetzen JA/NEIN, bei nein verschiebe nächste Datei, oder benenne sie um.

    Es wäre sehr nett, wenn mir jemand helfen könnte. Danke!
    Was du "Abfrage" nennst ist ein Dialog - also ein Form poppt auf, und das Programm hält inne, bis es geschlossen ist.

    Ein Dialog "kommt" auch nicht einfach so, sondern muss man hinprogrammieren - in den Code vorzugsweise.
    Hast du schon Code, wo solch rein soll, oder ... ?

    Allgemein geht man so vor: Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Du müsstest also ein Form basteln, wo die Frage an den User angezeigt wird, und wo der User aus ein paar Möglichkeiten eine auswählen kann.
    Diese Auswahl muss anschließend verarbeitet werden.
    Also Code drum herum existiert. Ich habe zwei Listboxen Quelle und Ziel, die lasse ich mir über eine Index Variable einlesen (der Reihe nach). Das geh auch soweit.
    Nur diese Dialogbox wäre jetzt noch sehr gut, leider weiß ich da weniger, wie man das machen kann.

    VB.NET-Quellcode

    1. Try
    2. For index As Integer = 0 To (ItemsInBox2 - 1)
    3. exactFile = ListBox4.Items(index).ToString()
    4. Dim file = New FileInfo(ListBox4.Items(index).ToString)
    5. fileExtensionAndName = file.Name.ToString
    6. Try
    7. My.Computer.FileSystem.MoveFile(exactFile, fileExtensionAndName, True)
    8. Catch ex As Exception
    9. MessageBox.Show("Fehler: " + ex.Message, "Achtung")
    10. End Try
    11. Next
    12. Catch ex As Exception
    13. MessageBox.Show("Fehler BTN1: " + ex.Message, "Achtung")
    14. End Try
    Gerne entferne ich das. Nur es geht hier doch um Verschiebungsvorgänge, warum macht da Try Catch weniger Sinn?

    VB.NET-Quellcode

    1. For index As Integer = 0 To (ItemsInBox2 - 1)
    2. exactFile = ListBox4.Items(index).ToString()
    3. Dim file = New FileInfo(ListBox4.Items(index).ToString)
    4. fileExtensionAndName = file.Name.ToString
    5. My.Computer.FileSystem.MoveFile(exactFile, fileExtensionAndName, True)
    6. Next​
    Was du mit TryCatch fängst, sind Fehlermeldungen. Was drinne bleibt sind die Fehler, und das geht garnet. Niemals ein Proggi nach einer Messagebox einfach weiterlaufen lassen, wenn ein Fehler aufgetreten ist!
    TryCatch ist ein heißes Eisen

    zur eigentlichen Frage:
    FileInfo kann ja die Existenz feststellen, da kann es sein, dass eine Datei schon existiert, oder mehrere, oder evtl. existiert auch der ZielPfad garnet, oder mehrere.
    Wie sieht nun das Konzept aus: wann soll der Dialog angezeigt werden, und welche Optionen soll er bieten?
    Danke für die Antwort, gut die Begründung verstehe ich!

    Ich hab mal ein wenig weiter gemacht:

    VB.NET-Quellcode

    1. If (System.IO.File.Exists(zielVerzeichnis + "\" + fileExtensionAndName)) Then
    2. MessageBox.Show("File wird überschrieben...")
    3. My.Computer.FileSystem.MoveFile(exactFile, fileExtensionAndName, True)
    4. Else
    5. My.Computer.FileSystem.MoveFile(exactFile, fileExtensionAndName, False)
    6. End If


    Ein Dialog sollte jetzt abfragen Darf überschrieben werden JA/NEIN und dann wäre es gut, wenn die Datei Automatisch umbenannt werden kann.
    wenns nur die Optionen ja oder nein sind, dann reicht eine simple Messagebox:

    VB.NET-Quellcode

    1. For Each fullname As String In Listbox4.Items
    2. Dim fi = New FileInfo(fullname)
    3. If fi.Exists Then
    4. If MessageBox.Show("alte Datei umbenennen oder belassen wie's war?", "ZielDatei bereits vorhanden", MessageBoxButtons.YesNo) <> DialogResult.Yes Then Continue For
    5. Dim backupName = fi.FullName.Insert(fi.FullName.Length - fi.Extension.Length - 1, "Back")
    6. Dim fiBack = New FileInfo(backupName)
    7. If fiBack.Exists Then fiBack.Delete()
    8. fi.MoveTo(fiBack.FullName)
    9. End If
    10. My.Computer.FileSystem.MoveFile(exactFile, fullname)
    11. Next
    @VB.neter0101 zwei Anmerkungen:
    • wenn diese Lösung, dann bitte ohne die - 1:

      VB.NET-Quellcode

      1. Dim backupName = fi.FullName.Insert(fi.FullName.Length - fi.Extension.Length, "Back")

    • schlage ich vor, die Extension zu ändern (eine Zwischen-Extension einzuschieben):

      VB.NET-Quellcode

      1. Dim backupName = IO.Path.ChangeExtension(fi.FullName, "Back" & fi.Extension)

      da wird aus "C:\Temp\Test.jpg" ==> "C:\Temp\Test.Back.jpg".
      Das ist aber Geschmackssache.

    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.neter0101 schrieb:

    Hilfsansicht
    Ich hab einen Haltepunkt auf die nächste Zeile gesetzt und bin dann mit der Maus auf die Variable.
    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!
    Mhh. hier ist noch etwas komisch:

    VB.NET-Quellcode

    1. If (System.IO.File.Exists(zielVerzeichnis + "\" + fileExtensionAndName)) Then
    2. Dim result As Integer = MessageBox.Show("Soll die Datei überschrieben werden?", "Achtung", MessageBoxButtons.YesNoCancel)
    3. If result = DialogResult.Cancel Then
    4. MessageBox.Show("abgebrochen", "Info")
    5. ElseIf result = DialogResult.No Then
    6. 'NEIN
    7. ElseIf result = DialogResult.Yes Then
    8. 'JA
    9. My.Computer.FileSystem.MoveFile(exactFile, zielVerzeichnis + "\" + fileExtensionAndName, True)
    10. End If
    11. Else
    12. My.Computer.FileSystem.MoveFile(exactFile, zielVerzeichnis + "\" + fileExtensionAndName, False)
    13. End If


    Wenn ich mit JA bestätige bekomme ich eine Fehlermeldung:

    Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.

    Also das komische ist, mit try catch vor moveFile funktionierts, aber try catch soll ich doch nicht benutzen?!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB.neter0101“ ()

    VB.neter0101 schrieb:

    da sie von einem anderen Prozess verwendet wird
    Bei solchen Meldungen hat das System i.A. Recht.
    Analysiere mal, wo und wie Du in Deinem Programm auf diese Datei zugreifst.
    Wenn das ne Bitmap ist, wird es etwas tricky die auszulesen und zugreifbar zu machen.
    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.neter0101 schrieb:

    Also das komische ist, mit try catch vor moveFile funktionierts,
    Das bezweifel ich sehr.
    Du hast bei TryCatch nur nicht gemerkt, dass es nicht funktioniert hat.

    Und wie Rod sagt: Kriege erstmal raus, welche Datei genau das ist, und welche Rolle die in deim Programm spielt.
    ZB ein Haltepunkt könnt hilfreich sein - guck ma überhaupt ein paar Debugging-Tricks an: VisualStudio richtig nutzen