System.IO Move Befehl und Code-Verbesserung

  • VB.NET

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

    System.IO Move Befehl und Code-Verbesserung

    Hi,

    ich würde mich gerne von euch verbessern lassen. Gibt es in meinem Code wichtige Dinge, die ich verbessern sollte/muss?

    VB.NET-Quellcode

    1. 'Aktion des Buttons
    2. Private Sub Button21_Click(sender As Object, e As EventArgs) Handles Button21.Click
    3. If RadioButton10.Checked = True Then
    4. If lb1.Items.Count() < 1 Then
    5. MessageBox.Show("Liste Leer", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
    6. Else
    7. For indexOrdnerAnfang As Integer = 0 To (lb2.Items.Count - 1)
    8. Dim RootName As String = GetOrdnerRoot(lb2.Items(indexOrdnerAnfang).ToString)
    9. MessageBox.Show("Root: " + RootName)
    10. Dim VollerName As String = GetFullPath(lb2.Items(indexOrdnerAnfang).ToString)
    11. MessageBox.Show("Full: " + VollerName)
    12. Dim FolderName As String = GetFileName(lb2.Items(0).ToString)
    13. MessageBox.Show("Name: " + FolderName)
    14. Try
    15. 'GUT SO, ODER GEHTS BESSER?
    16. System.IO.Directory.Move(VollerName, RootName + "\" + Ordnertb.Text + FolderName)
    17. Catch ex As Exception
    18. MessageBox.Show("Error: " + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    19. End Try
    20. Next
    21. End If
    22. lb2.Items.Clear()
    23. lb1.Items.Clear()
    24. End If
    25. End Sub
    26. 'LB füllen
    27. Private Sub lb1_DragDrop(sender As Object, e As DragEventArgs) Handles lb1.DragDrop
    28. Dim droppedItems As String() = e.Data.GetData(DataFormats.FileDrop)
    29. For Each file In droppedItems
    30. Dim GanzerOrdnerPfad = GetOrdnerFull(file)
    31. lb2.Items.Add(GanzerOrdnerPfad)
    32. 'GUT SO, ODER GEHTS BESSER?
    33. Dim OrdnerName As String = New System.IO.DirectoryInfo(GetOrdnerFull(file)).Name
    34. lb1.Items.Add(OrdnerName)
    35. Next
    36. End Sub
    37. 'Funktionen
    38. Public Function GetOrdnerFull(path As String)
    39. Return System.IO.Path.GetFullPath(path)
    40. End Function
    41. Public Function GetOrdnerRoot(path As String)
    42. Return System.IO.Path.GetDirectoryName(path)
    43. End Function
    44. Public Function GetFileName(path As String)
    45. Return System.IO.Path.GetFileNameWithoutExtension(path)
    46. End Function
    Arbeite nicht mit Strings, sondern mit Instanzen von FileInfo, bzw. DirectoryInfo. In eine Listbox kannst Du jedes beliebige Objekt stecken. Weiterhin kannst Du einer Listbox eine DataSource zuweisen, gegen die Du dann arbeiten kannst, bzw. solltest. Dabei ersparst Du Dir das Casten.

    Eine kleine Beschreibung, was Dein Programm generell machen sollte, wäre vielleicht angebracht gewesen. Finde es etwas unhöflich, einfach Code hinzuklatschen und zu sagen: "Verbessert mal."

    Statements wie:

    VB.NET-Quellcode

    1. If RadioButton10.Checked = True Then
    2. End If


    kannst Du abkürzen mit:

    VB.NET-Quellcode

    1. If RadioButton10.Checked Then
    2. End If


    VB.NET-Quellcode

    1. If lb1.Items.Count() < 1 Then
    2. End If


    soll wohl bedeuten:

    VB.NET-Quellcode

    1. If lb1.Items.Count() = 0 Then
    2. End If


    Schau Dir einfach mal an, was DirectoryInfo und FileInfo alles für Dich tun kann. Hier mit Strings arbeiten, macht Dich nicht glücklich.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Gib allem logische Namen, z.B. rbMoveDir anstatt RadioButton10 und am besten immer in englisch.

    Verknüpfe Strings logischerweise mit &, anstatt +.
    1+1=2
    1&1="2*"1

    Um Pfade zu verknüpfen, gibt es die IO.Path.Combine Methode.
    Beispiel:

    VB.NET-Quellcode

    1. Dim PathToMove As String = IO.Path.Combine(Name, RootName, DirTb.Text, FolderName)
    2. System.IO.Directory.Move(PathToMove)

    Mir ist auch noch eine Frage eingefallen:

    Ich würde gerne einen Ordner von Test --> test (toLower) umbenennen

    VB.NET-Quellcode

    1. Dim lowerString As String
    2. lowerString = OrdnerName.ToLower()
    3. MessageBox.Show("Lower: " + lowerString)
    4. System.IO.Directory.Move(VollerName, RootName + "\" + lowerString + "klein")


    Leider macht er das nicht mit zumindest bei Ordnern.
    Bei Dateien scheint das zu gehen, dann mit File.Move().

    Aber warum funktioniert das nicht mit Ordnern?
    Ja durchaus.

    Also diesen Code verwende ich in einer ganz neuen Form Anwendung. Beim Klicken auf den Button, sollte dann von ORDERNAME --> ordnername (ToLower) gemacht werden.
    macht er leider nicht....

    Hier nochmal der Code:

    VB.NET-Quellcode

    1. Dim lowerString As String
    2. lowerString = OrdnerName.ToLower()
    3. MessageBox.Show("Lower: " + lowerString)
    4. System.IO.Directory.Move(VollerName, RootName + "\" + lowerString + "klein")


    Also selbst hierbei hat der Befehl Schwierigkeiten:

    VB.NET-Quellcode

    1. System.IO.Directory.Move("C:\Users\User001\Desktop\First123 Kopie(4)", "C:\Users\User001\Desktop\First123 Kopie(4)".ToLower)

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

    Das heisst, an deine Verbesserungen bist du nicht mehr interessiert. - sonst würdeste meine Frage ja beantworten:

    ErfinderDesRades schrieb:

    ...alle Verbesserungsvorschläge eingebastelt? - wie sieht jetzt der Code aus?
    weil das war ja längst noch nicht alles...

    aber zur neuen Frage: Windows unterscheidet im Dateisystem nicht zw. Groß/Klein-Buchstaben - es ist ihm einfach piepe, und nimmt das, wies zuerst gesagt wurde.
    Um es zu ändern müssteste als Workaround die Datei woanners hinschieben, und dann - in Kleinbuchstaben - wieder zurück.

    glaub ich - probiert habichs nicht.
    Achso, die Frage ist dann, warum funktioniert selbiges aber mit Dateien?

    VB.NET-Quellcode

    1. System.IO.File.Move("C:\Users\User001\Desktop\First123 Kopie(4).dateityp", "C:\Users\User001\Desktop\First123 Kopie(4).dateityp".ToLower)


    Ich glaube Sinnvoll wäre dann sowas wie ein temporärer String. Also umbenennen in temp String und dann ursprünglichen String in Lower. Oder?


    VB.NET-Quellcode

    1. Try
    2. System.IO.Directory.Move("C:\Users\User001\Desktop\WERTZUI", "C:\Users\User001\Desktop\temp\WERTZUI".ToLower)
    3. Catch ex As Exception
    4. MessageBox.Show("Error: " + ex.Message, "FehlerXY", MessageBoxButtons.OK, MessageBoxIcon.Error)
    5. End Try
    6. Try
    7. System.IO.Directory.Move("C:\Users\User001\Desktop\temp\wertzui", "C:\Users\User001\Desktop\wertzui")
    8. Catch ex As Exception
    9. MessageBox.Show("Error: " + ex.Message, "FehlerXY", MessageBoxButtons.OK, MessageBoxIcon.Error)
    10. End Try


    // So geht's

    Aber ist MM nicht besonders brauchbar. Besser wäre es, wenn man einfach einen String übergeben könnte, den man dann temporär ändert...

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

    VB.neter0101 schrieb:

    VB.NET-Quellcode

    1. Public Function GetOrdnerFull(path As String)
    Hat Dein Programm Option Strict On?
    Wozu sollen die Ordnernamen klein geschrieben werden? "Camel Case" erleichtert das Lesen deutlich.
    Wahrscheinlich willst Du, dass lediglich "WERTZUI" klein geschrieben wird, nicht aber "C:\Users\User001\Desktop\".
    Dann behandle auch nur den letzten Teil deines Pfades mit ToLower().
    Bei den System-Verzeichnissen dürfte da nix passieren dürfen!
    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!