Datei bereits vorhanden --> Umbenennen?

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

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Lico.

    Datei bereits vorhanden --> Umbenennen?

    Moin,

    mein erster Beitrag und gleich eine Frage. :) Mein Quellcode liest alle Dateien in einem Ordner aus und verschiebt die Dateien in einen Ordner, der gleichlautend zum Dateinamen heißt. Falls der Ordner noch nicht existiert, wird ein Ordner erstellt und dann verschoben.

    VB.NET-Quellcode

    1. Select Case True
    2. Case File.Exists(strZielordner & strDatei2)
    3. strDateinameNeu = InputBox("Die angebenene Datei existiert bereits! Bitte einen neuen Dateinamen angeben", "Hinweis")
    4. File.Move(strZielordner, strZielordner & strDatei2)
    5. If MsgBox("Soll Datei " & strZielordner & strDatei2 & " überschrieben werden?", vbYesNo) = MsgBoxResult.Yes Then
    6. File.Delete(strZielordner & strDatei2)
    7. Zaehler1 = Zaehler1 + 1
    8. File.Move(strDatei, strZielordner & strDatei2)
    9. End If
    10. Case Directory.Exists(strZielordner) = True
    11. File.Move(strDatei, strZielordner & strDatei2)
    12. Zaehler1 = Zaehler1 + 1
    13. Case IO.Directory.Exists(strZielordner) = False
    14. MkDir(strZielordner)
    15. Zaehler2 = Zaehler2 + 1
    16. Zaehler1 = Zaehler1 + 1
    17. File.Move(strDatei, strZielordner & strDatei2)
    18. End Select
    19. Next


    Was aber, wenn die Beispiel.txt bereits unter \Beispiel\Beispiel.txt existiert? Bisher Frage ich ja nach dem löschen. Ich möchte dem User aber anbieten, seine Datei via Inputbox umzubenennen.

    Beispiel.txt ---> Irgendwas.txt. Dann Move nach \Beispiel\Irgendwas.txt.

    Dabei soll der aktuelle Dateiname im Textfeld der Inputbox stehen, damit der User direkt sieht, welche Datei gerade vermackelt wird. Dort kann er dann den Text anpassen und den Lauf fortsetzen. So meine Wunschvorstellung. :) Was sagt Ihr dazu?

    Noch zu meiner Person (ein Vorstellungsforum habe ich nicht gefunden?):
    Mitte 20, IT´ler & Kaufmann in der Industrie, Student der WI mit Basiswissen in VB.Net, VBA & Java

    Danke und Gruß
    Lico
    Hi und Willkommen,

    Deine Ganze schreibweise lässt darauf schließen das du eigentlich von VBA und VB6(5/4) kommst
    Daher die Frage, willst du .NET richtig lernen oder willst du nur das es iwie funktioniert?

    Und was ist deine konkrete Frage?
    Das ist meine Signatur und sie wird wunderbar sein!
    @Lico Mein Meinung zu der Logik hinter Deinem Code: ist irrelevant, die Funktionalität sollte sich an den Wünschen Deiner Kunden orientieren. Oder an Deinen Wünschen, falls Du Dein eigener Kunde bist.
    Zu Deinem Code: Du hinkst ein bisschen dem state-of-the-art hinterher, wie Mono schon schrieb, und zwar bei so ziemlich jeder Codezeile
    Zu Deinem Verbesserungswunsch: Der 3. Parameter einer InputBox ist "DefaultResponse", also die Standardantwort, die dem Benutzer beim Aufploppen der InputBox vorgeschlagen wird. Da kann man eben auch Variablenwerte, in Deinem Fall einen Dateinamen angeben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Moin,

    Danke erstmal für die Antworten!

    Zu Deinem Code: Du hinkst ein bisschen dem state-of-the-art hinterher, wie Mono schon schrieb, und zwar bei so ziemlich jeder Codezeile


    Wie gesagt, ich bin total Anfänger auf dem Gebiet. Kann ich den Code hier einstellen und Ihr optimiert den dann? Ich will lernen, lernen, lernen. 8o Wo gibt´s Codebeispiele für State-of-the-Art Code?

    ​Zu Deinem Verbesserungswunsch: Der 3. Parameter einer InputBox ist "DefaultResponse", also die Standardantwort, die dem Benutzer beim Aufploppen der InputBox vorgeschlagen wird. Da kann man eben auch Variablenwerte, in Deinem Fall einen Dateinamen angeben.


    In diesem Fall bin ich mein eigener Kunde. :) Das mit dem Default-Parameter probiere ich mal aus.
    @Lico Es gibt (bestimmt nicht nur) einen Thread zu einem guten Buch und es gibt auch noch den Vorgänger direkt zum Download. Den letzteren bin ich streckenweise durchgegangen, da ist schon einiges zu erfahren.

    Zu Deinem Code: Vielleicht liegt es daran, dass ich den ganzen Sourcecode nicht kenne, aber mal einige Bemerkungen:
    • Zeile 1: Select Case True: ??? Select Case wird genutzt, um gleichartige If-Abfragen zu vermeiden, bei Dir gibt's aber nicht sonderlich viel Auswahl, welche Werte die auszuwertende Variable hinter Select Case annehmen kann, da True ja noch nicht mal eine Variable, sondern ein fixer Wert ist.
    • Zeile 7: Zaehler1 = Zaehler1 + 1: wenn man von dem vielleicht etwas allgemein gehaltenen Variablennamen absieht (mit den Variablennamen musst ja nur Du zurechtkommen), ist seit vielen Jahren auch Zaehler1 += 1 möglich und verhindert ein wenig, dass man sich verschreibt und zwei Werte addiert, die gar nicht zusammengehören, z.B. Zaehler1 = Zaehler + 1.
    • Zeile 10: Case Directory.Exists(strZielordner) = True: vom Case-Konstrukt mal abgesehen (s. erster Punkt) ist das "= True" überflüssig; dank der schönen Framework-Funktionsnamen erhöht sich nämlich der Lesekomfort, da man quasi den Code so lesen kann: "Für den Fall, dass das Verzeichnis exisitert, dann ...". Bei Dir liest es sich wie: "Für den Fall, dass die Aussage, dass das Verzeichnis exisitert, wahr ist, dann ..." So redet wohl keiner. Aber das ist Geschmackssache. Ich schrieb auch 25 Jahre lang so wie Du, meine Umgewöhnung bei Verwendung passender Funktionsnamen "= True" wegzulassen, dauerte nicht mal eine Woche. Dazu das Gegenstück: If Not Directory.Exists(strZielordner) Then ... : "Wenn das Verzeichnis nicht existiert, dann ...
    • Zeile 14: MkDir(strZielordner): Du benutzt in den anderen Zeilen die Funktionen aus dem IO-Namespace (z.B. Zeile 10), darum besser auch hier: Directory.Create(strZielordner)
    • Zeile 19: Next: der passende For-Schleifenkopf fehlt in Deiner Auflistung
    • allgemein: Deine Variablennamen enthalten teilweise den Variablentyp, also z.B. strZielordner. Ist nicht mehr zeitgemäß, da der Variablenname auch ohne die Typbezeichnung aussagekräftig genug sein sollte, aber jedem das Seine, ich hab da auch mein eigenes System.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed - Danke für den Input, ich werde mir Deine Links mal in Ruhe anlesen.

    Für den geneigten Interessenten habe ich hier mal den kompletten, derzeitigen Code eingefügt. Über Tipps & Hinweise bin ich immer dankbar. ^^

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. 'Variablen
    4. Dim strPfad As String
    5. Dim strDateiname As String, strZielordner As String, strDatei As String, strDatei2 As String
    6. Dim Zaehler1 As Long, Zaehler2 As Long
    7. Dim strDateityp As String
    8. Dim strDateinameNeu As String
    9. strPfad = TextBox1.Text
    10. strDateityp = ComboBox1.Text
    11. If strDateityp = "" Then strDateityp = "*.*"
    12. Zaehler1 = 0
    13. Zaehler2 = 0
    14. '******************************************************************************************************************
    15. TextBox1.Focus()
    16. 'Prüfung, ob TextBox1 Text enthält
    17. Select Case True
    18. Case (strPfad = "") = True
    19. MsgBox("Es wurde kein Pfad angegeben.", vbInformation, "Hinweis")
    20. Exit Sub
    21. Case (IO.Directory.Exists(strPfad) = False) = True
    22. MsgBox("Der angebene Pfad ist existiert nicht!", vbCritical, "Fehler")
    23. Exit Sub
    24. End Select
    25. MsgBox("Möchten Sie die Aktion durchführen?", vbYesNo)
    26. If vbYesNo = vbNo Then Exit Sub
    27. '******************************************************************************************************************
    28. Try
    29. For Each strFoundFile As String In My.Computer.FileSystem.GetFiles(strPfad, FileIO.SearchOption.SearchTopLevelOnly, strDateityp)
    30. strDatei = IO.Path.GetFullPath(strFoundFile)
    31. strDatei2 = IO.Path.GetFileName(strFoundFile)
    32. strDateiname = IO.Path.GetFileNameWithoutExtension(strFoundFile)
    33. strZielordner = strPfad & "\" & strDateiname & "\"
    34. Select Case True
    35. Case File.Exists(strZielordner & strDatei2)
    36. strDateinameNeu = InputBox("Die angebenene Datei existiert bereits! Bitte einen neuen Dateinamen angeben", "Hinweis")
    37. File.Move(strZielordner, strZielordner & strDateinameNeu)
    38. If MsgBox("Soll Datei " & strZielordner & strDatei2 & " überschrieben werden?", vbYesNo) = MsgBoxResult.Yes Then
    39. File.Delete(strZielordner & strDatei2)
    40. Zaehler1 = Zaehler1 + 1
    41. File.Move(strDatei, strZielordner & strDatei2)
    42. End If
    43. Case Directory.Exists(strZielordner) = True
    44. File.Move(strDatei, strZielordner & strDatei2)
    45. Zaehler1 = Zaehler1 + 1
    46. Case IO.Directory.Exists(strZielordner) = False
    47. MkDir(strZielordner)
    48. Zaehler2 = Zaehler2 + 1
    49. Zaehler1 = Zaehler1 + 1
    50. File.Move(strDatei, strZielordner & strDatei2)
    51. End Select
    52. Next
    53. 'Messagebox über durchgeführte Aktion. Falls keine beide Zähler auf 0 stehen, wird die erste Messagebox ausgegeben.
    54. If Zaehler1 = 0 And Zaehler2 = 0 Then
    55. MsgBox("Es wurden keine Aktion durchgeführt", vbInformation)
    56. Else
    57. MsgBox("Es wurden " & Zaehler2 & " Ordner erzeugt und " & Zaehler1 & " Dateien verschoben.")
    58. End If
    59. '******************************************************************************************************************
    60. Catch ex As Exception
    61. MsgBox(ex.Message, MsgBoxStyle.Critical)
    62. End Try
    63. End Sub
    64. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    65. 'Auswahl des Ordners für Einsortierung der Dateien
    66. Try
    67. TextBox1.Clear()
    68. Dim FolderDialog As New FolderBrowserDialog
    69. FolderDialog.ShowNewFolderButton = True
    70. If (FolderDialog.ShowDialog() = Windows.Forms.DialogResult.OK) Then
    71. TextBox1.Text = FolderDialog.SelectedPath
    72. End If
    73. Catch ex As Exception
    74. MsgBox(ex.Message, MsgBoxStyle.Critical)
    75. End Try
    76. End Sub
    77. Private Sub Button4_Click(sender As Object, e As EventArgs)
    78. 'Zeigt About-Texte
    79. AboutBox1.Show()
    80. End Sub
    81. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.LostFocus
    82. 'Aktion, die durchgeführt wird, wenn Textbox1 keinen Text enthält oder ungültige Pfadangabe enthält
    83. 'leer -> keine Aktion
    84. 'ungültiger Pfad -> Fehlermeldung
    85. Dim strPfad As String
    86. strPfad = TextBox1.Text
    87. Select Case True
    88. Case (strPfad = "") = True
    89. Case (IO.Directory.Exists(strPfad) = False) = True
    90. MsgBox("Der angebene Pfad ist existiert nicht!", vbCritical, "Fehler")
    91. End Select
    92. End Sub
    93. Private Sub TextBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseClick
    94. ToolTip1.SetToolTip(TextBox1, "Dieses Feld muss gefüllt sein")
    95. End Sub
    96. Private Sub ComboBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles ComboBox1.MouseClick
    97. ToolTip2.SetToolTip(ComboBox1, "Bei leerem Feld werden alle Dateien sortiert.")
    98. End Sub
    99. Private Sub ProgrammBeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ProgrammBeendenToolStripMenuItem.Click
    100. Me.Close()
    101. End Sub
    102. Private Sub ÜberToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ÜberToolStripMenuItem.Click
    103. 'Zeigt About-Texte
    104. AboutBox1.Show()
    105. End Sub
    106. End Class

    Lico schrieb:

    VB.NET-Quellcode

    1. MsgBox("Möchten Sie die Aktion durchführen?", vbYesNo)
    2. If vbYesNo = vbNo Then Exit Sub
    machst Du

    VB.NET-Quellcode

    1. If MsgBox("Möchten Sie die Aktion durchführen?", vbYesNo) = vbNo Then Exit Sub

    Lico schrieb:

    VB.NET-Quellcode

    1. AboutBox1.Show()
    Gugst Du hier.
    Eine einzige ToolTip-Lpmponente genügt.
    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!
    Tipps & Hinweise:

    VB.NET-Quellcode

    1. Option Strict On 'klopft Dir zurecht auf die Finger, wenn Du Dich nicht an die strengen Vorschriften hältst; Pflichteinstellung, sonst wird Dein Code Matschepampe
    2. Option Infer On 'Ermöglicht es größtenteils auf Variablentypangaben in der Variablendefinition zu verzichten, wenn eine Zuweisung sofort erfolgt, da die IDE selbst ermittelt, welcher Typ naheliegend ist.

    • "Form1", "Button1", ...: Elemente sollten wie normale Variablen aussagekräftige Namen haben. Solltest Du mal (wie ich) in die Verlegenheit kommen, 30 Steuerelemente in einer Form zu haben und dann das richtige zu suchen, helfen gute Namen schnell weiter.
    • Zeile 8 und 16: Variablendefinition und -initialisierung können/sollten (?) in einer Zeile vorgenommen werden, siehe Option Infer On. Wenn Dir zwischendurch einfällt, eine Anweisung mit einer noch nicht-initialisierten Variable zu machen, kann es typabhängig krachen. Gut, dass die meisten Grundvariablentypen einen Standardwert vom System erhalten.
    • Zeile 8: Zaehler1 und Zaehler2 sollen vom Typ Long sein. Sicher, dass das nicht overkill ist? Bei meinem System wäre der Maximalwert, den Deine Dateiverschiebungszähler hätten, bei 9223372036854775807. Wer soviele Dateien auf dem PC hin- und herschieben will, hat wohl sonst nix zu tun. Vielleicht reicht ja auch 1-2 Nummern kleiner (Integer, Short). Da sollte natürlich geschaut werden, ob die Anforderungen/Maximalwerte ausreichend sind. Und da die Zählervariablen in Deinem bisherigen Code nur höher werden, wären ggf. auch vorzeichenlose Typen relevant (z.B. UInt, bei mir 0-65535)
    • Zeile 24-31: Wie bereits geschrieben, da gehört eine If-Abfrage hin, inklusive folgender Einzelerstverbesserungen meinerseits:

    VB.NET-Quellcode

    1. If String.IsNullOrEmpty(strPfad) Then MsgBox("Es wurde kein Pfad angegeben.", vbInformation, "Hinweis"): Exit Sub
    2. 'Statt folgender Fehler-MsgBox könnte doch auch per IO.Directory.Create() der gewünschte Pfad erstellt werden, falls das in Deinem Interesse sein sollte.
    3. If Not IO.Directory.Exists(strPfad) Then MsgBox("Der angebene Pfad ist existiert nicht!", vbCritical, "Fehler"): Exit Sub
    • Zeile 33, 34: RodFromGermany schrieb aus gutem Grund eine Verbesserung, nicht aus Ästhetik, sondern wegen Funktionalität. vbYesNo ist ein fester Wert (nämlich 4) und vbNo auch (7). Dein Vergleich in Zeile 34 hat also die Aussage "Wenn 4 = 7, dann raus aus der Prozedur" - also nie.
    • Du wertest das Ergebnis auf zwei Arten aus. Entweder sofort (If MsgBox("Hinweis", MsgBoxStyle.YesNo) = MsgBoxStyle.No Then ... , so wie Du es in Zeile 87 gemacht hast) oder per Zuweisung an eine Variable und die wird später geprüft (gerne auch mit Select Case):

    VB.NET-Quellcode

    1. 'fiktives Beispiel
    2. Dim tp_MsgBoxEntscheidung As Microsoft.VisualBasic.MsgBoxResult = MsgBox("Wollen Sie vor dem Beenden Ihre Daten speichern?", MsgBoxStyle.YesNoCancel)
    3. Select Case tp_MsgBoxEntscheidung
    4. Case MsgBoxResult.Yes : SpeichereDaten(): BeendeProgramm()
    5. Case MsgBoxResult.No : BeendeProgramm()
    6. Case MsgBoxResult.Cancel : Exit Sub
    7. End Select
    • Zeile 38+76, 83+92: große Try...Catch-Blöcke zusammen mit einer MsgBox. Dazu der Hinweis auf einen passenden Thread von ErfinderDesRades
    • Zeile 67: If Zaehler1 = 0 AndAlso Zaehler2 = 0 Then, siehe Thread über die Unterschiede.
    • Zeile 88+89: Wenn Du Zeile 88 an Zeile 87 anhängst, kannst Du auf Zeile 89 verzichten.
    • Zeile 111: Not IO.Directory.Exists(strPfad) statt (IO.Directory.Exists(strPfad) = False) = True
    • Zeile 129: Wenn Du eingestellt hast, dass Dein Programm beim Schließen der Startform oder einzig vorhandenen Form beendet werden soll, ok. Allgemeingültiger wäre Application.Exit
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.