Datein in Listboxeinträge umbenennen

  • VB.NET

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

    Datein in Listboxeinträge umbenennen

    Hallo, nach dem ich mein Programm fast fertiggestellt habe, fehlt mir noch der entscheidende schritt, unzwar soll das Programm die Listbox einträge auslesen und die Datein dannach benennen, mein Problem:
    es muss erkennen welche Datei eigentlich die ist , die ich umbenannt habe,
    ich mach mal ein Bsp:

    in der Listbox sind jetzt 3 einträge:
    lied1.mp3
    lied2.mp3
    DCIM0122.jpg
    jetzt tu ich diese umbennenen und es steht da
    lied1umbenannt.mp3
    lied2umbenannt.mp3
    italien2010.jpg

    jetzt müssen die dateien umbenannt werden, dabei darf lied 1 nicht den namen lied2umbenannt bekommen.
    meine Idee war, das ich in die Listbox nicht nur den namen, sondern auch den Pfad eintrage aber der Pfad soll nicht sichtbar sein, sondern nur der name und ich weiß nicht wirklich wie ich das verwirklichen soll und auch nicht, wie ich die datein dann nach den einträgen umbenenne ich hab schon gesucht wie ein irrer aber nie was gefunden was ich jetzt anpassen könnte oder so also brächte mal hilfe.
    Also ich weiß ehrlich gesagt nicht, ob ich deine Frage jetzt ganz richtig verstanden habe...
    Du möchteste einfach die Dateien umbenennen und verhindern, dass du eine Datei 2mal umbenennst, oder wie?
    Wenn ja musst du doch einfach nur die Dateien, die du umbenennen willst, und die neuen Namen in ein Array laden und dann umbenennen... - Oder in deinem Fall kannst du auch die Listbox benutzen... Ich sehe dein Problem nicht ganz...?

    Und du kannst natürlich auch statt die Pfade in die Listbox zu laden einfach die Pfade in ein Array laden und die Namen in die Listbox. Das ist ja logischerweise kein Problem...

    Wenn ich deine Frage falsch verstanden habe, wäre es vielleicht nett, wenn du die Funktionsweise deines Programmes ein bisschen besser beschreiben könntest oder die Frage anders formulieren könntest...?

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

    Nehm die Listbox und lade dort die vollen Pfade rein. Dann benutzt du das FormatItem-Event und machst aus dem Item(der ganze Pfad) nur den Dateinamen. Somit wird nur der Dateiname angezeigt, aber der volle Pfad noch gespeichert.

    Dendem schrieb:

    meine Idee war, das ich in die Listbox nicht nur den namen, sondern auch den Pfad eintrage aber der Pfad soll nicht sichtbar sein,

    Du kannst in die Listbox nicht nur Strings laden sondern ganze Klassen / Objekte. Angezeigt wird in der Listbox das Ergebnis der ToString-Funktion der Klasse.

    Speicher also in der Klasse die OriginalPfade und die Namen, wenn Du dann die Namen änderst geht nichts verloren:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. ' Listbox testweise mit MP3 Klassen füllen
    4. ListBox1.Items.AddRange(New MP3() {New MP3("C:\temp\Beyonce.mp3"), New MP3("C:\temp\Shakira.mp3"), New MP3("C:\temp\Alicia Keys.mp3")})
    5. End Sub
    6. End Class
    7. Public Class MP3
    8. Public Property OriginalPfad As String
    9. Public Property Name As String
    10. Public Sub New(ByVal pfad As String, Optional ByVal name As String = "")
    11. Me.OriginalPfad = pfad
    12. If name = "" Then name = IO.Path.GetFileNameWithoutExtension(pfad)
    13. Me.Name = name
    14. End Sub
    15. Public Overrides Function ToString() As String
    16. Return Name
    17. End Function
    18. End Class
    @Kangaroo: es war nicht ersichtlich, dass es um MP3s ging, aber danke, dass du noch erwähnt hast, dass eine ItemCollection jeden Typ aufnehmen kann und nur der Text angezeigt wird der im FomatItem bestimmt wird (Standard e.Item.ToString())
    ok, erstmal danke für eure Tipps, ich versuche mal ganze objekte in die Listbox zu laden.
    @ Kangaroo: dein Code hat leider net gefunzt
    @ Timi257 genauere Beschreibung des Programms: also das Programm soll die inhalte eines Ordners laden, die werden dann in einer Listboxaufgelistet und ich kann die daten umbenennen, in meinem Fall will ich eig. nur die extension ändern, der codec soll gleich bleiben, was beim umbenennen ja der Fall ist, und dann soll es die Namen die in der listbox drin stehen auf die Datein übertragen, von denen der name ursprünglich auch kam

    Dendem schrieb:

    @ Kangaroo: dein Code hat leider net gefunzt

    Könntest Du noch etwas undeutlicher sein ?

    Wenn es Deiner Aussage nach nicht "funzt", solltest Du wenigstens mal sagen was genau nicht, z.B. ein Fehlermeldung. Ich gehe davon aus , dass ich nicht extra sagen musste, Du solltest 1 Button mit Namen Button1 und 1 Listbox mit Namen Listbox1 auf einer leeren Form plazieren - oder ?
    Also ich habe neulich mit der FileInfo-Klasse gearbeitet. Die kannst du auch direkt in die Listbox adden, es wird der Name ohne Pfad angezeigt. Dir stehen dann aber mit DirectCast(Listboxbla. Item(x), Fileinfo) alle Member zur Verfügung. Damit kannst du alle deinen Manipulationen vornehmen.
    Fiel Fergnügen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    ok Vatter ich werds mal versuchen,
    @ Kangoroo sry, fehler :Fehler
    - Eine Eigenschaft ohne einen ReadOnly- oder WriteOnly-Bezeichner muss ein "Get" und ein "Set" haben. bei (Originalpfad() as string)
    - Eine Anweisung kann nicht innerhalb eines Eigenschaftentexts verwendet werden. Das Ende der Eigenschaft wird angenommen. bei beiden Public Property
    - Bei Me.name: Me.name ist kein Member von Umbenennen.mp3
    - Bei return Name: Name ist nicht deklariert

    da ich eine sehr lange programier pause hintermir hab, hab ich leider kein Plan wie ich des beheben kann :cursing:

    Danke im Vorraus
    Hab ma gekramt und das hier wiedergefunden:
    Da werden die Dateien von Verzeichnis A in Listbox1 und Verzeichnis B in Listbox 2 angezeigt und mittels 2er Button kannst du Dateien von Verzeichnis A nach B und umgekehrt kopieren.

    Spoiler anzeigen
    Listbox mit Dateien eines Verzeichnis befüllen

    VB.NET-Quellcode

    1. Private Sub ListBoxFill(ByVal LB As ListBox, ByVal DirInfo As DirectoryInfo)
    2. LB.Items.Add(" * " & DirInfo.FullName)
    3. LB.Items.AddRange(DirInfo.GetFiles)
    4. For Each SubDir As DirectoryInfo In DirInfo.GetDirectories
    5. ListBoxFill(LB, SubDir)
    6. Next
    7. End Sub

    Und das kopieren einer Datei von einem ins andere Verzeichnis

    VB.NET-Quellcode

    1. Private Sub Btn_AB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_AB.Click
    2. CopyDatei(DirectCast(LB_A.SelectedItem, FileInfo), _
    3. My.Settings.Pfad_A, My.Settings.Pfad_B)
    4. End Sub
    5. Private Sub Btn_BA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_BA.Click
    6. CopyDatei(DirectCast(LB_B.SelectedItem, FileInfo), _
    7. My.Settings.Pfad_B, My.Settings.Pfad_A)
    8. End Sub
    9. Private Sub CopyDatei(ByVal Info As FileInfo, ByVal QuellOrdner As String, ByVal ZielOrdner As String)
    10. Dim QuellInfo As FileInfo = Info
    11. Dim ZielInfo As New FileInfo(Info.FullName.Replace(QuellOrdner, ZielOrdner))
    12. Dim QuellPfad As String = QuellInfo.FullName
    13. Dim Zielpfad As String = ZielInfo.FullName
    14. If Not ZielInfo.Directory.Exists Then
    15. ZielInfo.Directory.Create()
    16. End If
    17. File.Copy(QuellPfad, Zielpfad, True)
    18. LB_A.Items.Clear()
    19. ListBoxFill(LB_A, New DirectoryInfo(My.Settings.Pfad_A))
    20. LB_B.Items.Clear()
    21. ListBoxFill(LB_B, New DirectoryInfo(My.Settings.Pfad_B)) 'wandelt dfen Quellpfad in den Zielpfad um
    22. End Sub

    Fiel Fergnügen damit
    vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

    Dendem schrieb:

    Eine Eigenschaft ohne einen ReadOnly- oder WriteOnly-Bezeichner muss ein "Get" und ein "Set" haben. bei (Originalpfad() as string)

    Danke, damit kann ich schon mehr anfangen: In VS 2010 ist es erlaubt Properties so zu deklarieren (Auto-Implemented Properties), in VS 2008 allerdings war das nicht der Fall.

    Da in diesem Fall sowieso keine Notwendigkeit besteht unbedingt Properties zu verwenden, nehmen wir einfach ganz normale Variablen. So sollte es auch bei Dir laufen:

    "VS 2008 Version"

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. ' Listbox testweise mit MP3 Klassen füllen
    4. ListBox1.Items.AddRange(New MP3() {New MP3("C:\temp\Beyonce.mp3"), New MP3("C:\temp\Shakira.mp3"), New MP3("C:\temp\Alicia Keys.mp3")})
    5. End Sub
    6. End Class
    7. Public Class MP3
    8. Public OriginalPfad As String
    9. Public Name As String
    10. Public Sub New(ByVal pfad As String, Optional ByVal name As String = "")
    11. Me.OriginalPfad = pfad
    12. If name = "" Then name = IO.Path.GetFileNameWithoutExtension(pfad)
    13. Me.Name = name
    14. End Sub
    15. Public Overrides Function ToString() As String
    16. Return Name
    17. End Function
    18. End Class



    Vatter's Tip mit der Speicherung der FileInfo-Klasse ist übrigens auch gut.
    Also erstmal danke für eure bemühungen,
    @kangaroo kannst du mir den code villeicht mal erklären damit ich überhaupt weiß, für was überhaupt was steht, weil ich seh grad nur bahnhof, und ich will nicht umbedingt codes, die ich selbst nciht checke :D da ist das verändern total mühsam
    @VAtter Das mit dem DirectCast funzt erstmal super, zumindest das auslesen damit, ich weiß nur nicht, wie ich dann die extension auslesen kann bzw.
    die datein damit umbenennen.
    hmm soweit sogut, ich hab jetzt mal versucht die Sache über directcast abzurufen, klappt auch ganz gut, nur ein problem hab ich:

    VB.NET-Quellcode

    1. Dim oFile As IO.FileInfo = DirectCast(ListBox1.SelectedItem, IO.FileInfo)
    2. Dim Filename as string = oFile.Name
    3. Dim Extension As String = oFile.Extension
    4. Dim Newextension As String = (TextBox3.Text)
    5. MsgBox(Filename + Newextension)


    Das Objekt des Typs "System.String" kann nicht in Typ "System.IO.FileInfo" umgewandelt werden.

    Msgbox ist indem fall nur um zu überprüfen ob auch das ausgegeben wird, was ich will, ich tu die Msgbox dann mit nem Replace oder so ersetzen, aber erstmal das Problem lösen -.-
    wie ich halt echt zu dumm bin den Fehler zu finden -.-
    *facepalm*

    VB.NET-Quellcode

    1. Dim oFile As IO.FileInfo = DirectCast(ListBox1.SelectedItem, IO.FileInfo) ' hier falsch
    2. Dim oFile As IO.FileInfo = New IO.FileInfo(Convert.ToString(ListBox1.SelectedItem)) ' richtig

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

    Dank Mangafreak hab ich meinem Code zusammen geschnipselt und es hat funktioniert, ich habs ja erstmal mit Selected item verscuht
    jetzt hab ich eine For each schleichfe in betracht genommen, um jedes file nach und nach umzubenennen:

    VB.NET-Quellcode

    1. For Each i In ListBox1.Items
    2. My.Computer.FileSystem.RenameFile(TextBox1.Text + "\" + ListBox1.Items(i), _
    3. IO.Path.GetFileNameWithoutExtension(ListBox1.Items(i) + "." + TextBox3.Text))
    4. Next


    leider steht da dann:

    Ungültige Konvertierung von der Zeichenfolge "Names Der Datei" in Typ Integer.
    aber soweit ich weiß, hab ich außer dem i nirgens einen Integer benutzt, und das i ist auch nur die angabe für das Item
    need help pls

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

    Du benutzt aber den +-Operator. Dann denkt er du willst Zahlen kombinieren/addieren. Für Strings solltest du den &-Operator nehmen.
    Hi Mangafreak1995:

    Mangafreak1995 schrieb:

    Dim oFile As IO.FileInfo = DirectCast(ListBox1.SelectedItem, IO.FileInfo) ' falsch

    das is nur dann falsch, wenn der Listbox Strings geaddet werden. In meinem Beispiel hatte ich direkt die Fileinfo in die Liste gepackt. Da gehts dann auch mit diesem Code. :)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    @Vatter: entschuldige, du hast ja recht :| In diesem Fall ist es aber der Fall. Kaum einer der Anfänger weiß dass es ein ObjectArray ist und kein StringArray ist.