Nachhilfe bei codezusammenführung | Massen Umbenennung mit Hindernissen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Nudelholzwerfer.

    Nachhilfe bei codezusammenführung | Massen Umbenennung mit Hindernissen

    Hallo ich brauche etwas Hilfe bei Zusammenfügen einiger Codeschnipsel

    Hintergrund:
    Ich möchte Dateien per Drag&Drop auf eine Listbox ziehen,
    diese sollen dann entsprechend des Inhaltes ihrer ersten Zeile umbenannt werden



    Mit diesem Codeabschnitt Fülle ich eine Listbox mit Dateipfaden

    Visual Basic-Quellcode

    1. Private Sub ListBox1_DragDrop(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragDrop
    2. If e.Data.GetDataPresent(DataFormats.FileDrop) Then
    3. Dim filePaths As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())
    4. For Each s As String In filePaths
    5. ListBox1.Items.Add(s)
    6. Next s
    7. End If
    8. End Sub


    Dieser Codeabschnitt liest die erste Zeile aus einem Dokument aus und gibt mir einen teil dieser Zeile als variable zurück Der Pfad des Dokuments steht in diesem Fall in der Textbox1 (bzw eigentlich in der listbox1 durch das Drag&Drop)
    er teil der ersten Zeile wird in der textbox2 ausgegeben (die Originalzeile hat das Schema: $A123.MIN wobei der Buchstabe und die anzahl an ziffern variieren) (in textbox2 wird dann A123 Ausgegeben)

    Visual Basic-Quellcode

    1. Private Sub Button_Starter_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. Dim fs As IO.FileStream = New IO.FileStream(TextBox1.Text, IO.FileMode.Open, IO.FileAccess.Read)
    3. Dim w As IO.StreamReader = New IO.StreamReader(fs)
    4. Dim name As String
    5. name = w.ReadLine
    6. w.Close()
    7. fs.Close()
    8. 'alles ab ".MIN" abschneiden
    9. Dim ePos As Integer = name.LastIndexOf("."), sPos As Integer = name.LastIndexOf("$", ePos)
    10. name = name.Substring(sPos, ePos - sPos)
    11. 'Das Erste Zeichen "$" abschneiden
    12. name = Mid(name, 2, Len(name) - 1)
    13. TextBox2.Text = name
    14. End Sub


    Ich möchte nun, das jede Datei die in der listbox1 per Drag&Drop abgelegt wird umbenannt wird der neue Name, soll der sein, der in textbox2 angezeigt wird.
    Die Dateiendung soll erhalten werden (sie ist immer .CNC)

    Ich hoffe ich habe das ganze verständlich rübergebracht :D

    Grüße Kevin

    Nudelholzwerfer schrieb:

    Ich möchte Dateien per Drag&Drop auf eine Listbox ziehen,
    diese sollen dann entsprechend des Inhaltes ihrer ersten Zeile umbenannt werden
    Was hat das mit Massen-Umbenennungen zu tun?
    Ziehst du ganz viele Dateien auf deine Listbox?

    Soll die Umbenennerei sofort erfolgen, oder willst du einen Button dafür spendieren?

    Was soll geschehen mit Dateien, die gar keinen TExt enthalten, oder deren erste Zeile leer oder sonstwie ungeeignet ist?

    Edit: Korrigiere bitte deine Labelung. Hier gehts glaub nicht um Vb6

    ErfinderDesRades schrieb:

    nicht um Vb6
    Jou.
    @Nudelholzwerfer Willkommen im Forum. :thumbup:
    Bearbeite diesen Thread und mach da VB.NET draus, das erhöht die Hilfe-Wahrscheinlichkeit enorm.
    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!

    ErfinderDesRades schrieb:

    Was hat das mit Massen-Umbenennungen zu tun?
    Ziehst du ganz viele Dateien auf deine Listbox?
    Ganz genau =) die Listbox habe ich eigentlich nur gewählt weil ich anfangs erst nur die files aufgelistet habe (zur selbstkontrolle),
    diese kann aber auch gegen ein Textfeld oder ein Bild getauscht werden das ist eigentlich egal


    Soll die Umbenennerei sofort erfolgen, oder willst du einen Button dafür spendieren?
    sofort wäre am einfachsten

    Was soll geschehen mit Dateien, die gar keinen TExt enthalten, oder deren erste Zeile leer oder sonstwie ungeeignet ist?
    Den fall gibt es nicht (zumindest nicht bei der Anwendung für die ich das vorsehe)
    Edit: Korrigiere bitte deine Labelung. Hier gehts glaub nicht um Vb6
    Ok danke für den Hinweis ;)


    @ ErfinderDesRades Farbe Korrigiert ;)

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

    ErfinderDesRades: Rot ist hier auf VBP nur für Moderatoren erlaubt - bitte korrigieren (etwa andere Farbe, oder anders zitieren, nämlich ausschnittsweise statt Vollzitat).
    Ist vlt jetzt bisserl umständlich für dich das jetzt zu korrigieren, aber ausnahmsweise durchgehen lassen wäre neuer Präzedenzfall, und da gibts kein Konsenz für.

    Nudelholzwerfer schrieb:

    ErfinderDesRades schrieb:

    Was hat das mit Massen-Umbenennungen zu tun?
    Ziehst du ganz viele Dateien auf deine Listbox?
    Ganz genau =)
    Aha - Zusatzfrage: Ziehst du auch DateiOrdner aufs Form?
    Wenn ja, was soll damit passieren, und wie sollen die in der Listbox dargestellt sein?

    Was soll geschehen mit Dateien, die gar keinen TExt enthalten, oder deren erste Zeile leer oder sonstwie ungeeignet ist?
    Den fall gibt es nicht (zumindest nicht bei der Anwendung für die ich das vorsehe)
    (Ähm - ich bin geneigt, dich auszulachen, aber meine gute Erziehung verbietet mir das ;) )
    Aber ist ein Problem, was man hintanstellen kann.

    also ich guggemol, was zu basteln

    Ach - du kannst eiglich auch was tun:
    1. Option Strict On!
    2. http://www.vb-paradise.de/index.php/Thread/91397-boese-funktionen-vermeiden/#post757971
    3. Schreibe eine Methode, die eine List(Of FileInfo) entgegennimmt, und mit FileInfo.Move umbenennt. Evtl. mit VisualStudio richtig nutzen (Google ist nicht deine Mami) erst noch lernen, wie die genannten Klassen zu recherchieren sind.


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

    Nudelholzwerfer schrieb:

    sofort wäre am einfachsten
    Probier mal dies:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim fis() = New IO.DirectoryInfo("C:\Temp").GetFiles("*.jpg", IO.SearchOption.AllDirectories)
    3. For Each fi In fis
    4. Dim name = fi.Name
    5. name = DateTime.Now.ToShortDateString & "_" & name
    6. fi.MoveTo(fi.DirectoryName & "\" & name)
    7. Next
    8. End Sub
    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!
    @ ErfinderDesRades :
    Nein deshalb ja der untere Codeschnipsel der muss quasi vor jeder Datei durchlaufen :/

    Also generell es werden nur Dateien in die Listbox (oder was auch immer) gezogen.
    ich schließe aus das etwas anderes darauf gezogen wird (da ich momentan der einzige Nutzer davon bin und den rest penibelst anlerne).

    Der dateianfang ist immer gleich danach kann der text variieren aber das ist ja kein Problem
    Die |NUL| Blöcke werden vernachlässigt diese nicht mitgelesen werden (unbekanntes Zechen)

    Nudelholzwerfer schrieb:

    vor jeder Datei durchlaufen
    Wo ist das Problem?
    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!
    ich merk schon ich formuliere zu kompliziert :D

    Das ist der 2. schnipsel (ohne den button ;) )
    Das müsste vor jeder Datei durchlaufen,
    da ich aber keine Ahnung habe wie ich das umsetzen soll habe ich mir um diesen teil zu testen das mit dem Button gemacht
    Die Textbox war einfach zur Kontrolle für mich hätte genausogut msgbox nehmen können (entfällt ja nun)
    Die variable "name" soll dann in den neuen Dateinamen.

    VB.NET-Quellcode

    1. Dim fs As IO.FileStream = New IO.FileStream(TextBox1.Text, IO.FileMode.Open, IO.FileAccess.Read)
    2. Dim w As IO.StreamReader = New IO.StreamReader(fs)
    3. Dim name As String
    4. name = w.ReadLine
    5. w.Close()
    6. fs.Close()
    7. 'alles ab ".MIN" abschneiden
    8. Dim ePos As Integer = name.LastIndexOf("."), sPos As Integer = name.LastIndexOf("$", ePos)
    9. name = name.Substring(sPos, ePos - sPos)
    10. 'Das Erste Zeichen "$" abschneiden
    11. name = Mid(name, 2, Len(name) - 1)
    12. TextBox2.Text = name
    Definiere

    Nudelholzwerfer schrieb:

    soll dann in den neuen Dateinamen.
    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!
    ja, aber bleibt doch derselbe Quatsch: Aus der Textbox wird ein Dateiname genommen, und aus der Datei wird der Name gelesen, denn die auf die Listbox gezogene Datei erhalten soll.
    Und sobald eine zweite Datei draufgezogen wird, knallts, denn dann wird versucht, zwei Dateien denselben Namen zu geben.


    ach - ich wollte ja ein Sample anhängen.
    Bin übrigens von meinem vor-überlegtne Code-Design abgewichen, notwendig ist einzig eine Methode TryMoveFile, die genau einen einzigen String verarbeitet, oder ihn aber ablehnt:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.IO
    3. Public Class Form1
    4. Private _Files As New BindingList(Of FileInfo)
    5. Public Sub New()
    6. InitializeComponent()
    7. FileInfoBindingSource.DataSource = _Files
    8. End Sub
    9. Private Sub lstFileInfos_DragOver(ByVal sender As Object, ByVal e As DragEventArgs) Handles lstFileInfos.DragOver
    10. If TypeOf e.Data.GetData(DataFormats.FileDrop) Is IEnumerable(Of String) Then e.Effect = DragDropEffects.Move
    11. End Sub
    12. Private Sub lstFileInfos_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles lstFileInfos.DragDrop
    13. For Each s In DirectCast(e.Data.GetData(DataFormats.FileDrop), IEnumerable(Of String))
    14. Dim fi = TryMoveFile(s)
    15. If fi IsNot Nothing Then _Files.Add(fi)
    16. Next
    17. End Sub
    18. Private Function TryMoveFile(ByVal fullname As String) As FileInfo
    19. If _Files.Any(Function(f) f.FullName = fullname) Then Return Nothing 'gibts schon
    20. Dim fi = New FileInfo(fullname)
    21. If Not fi.Exists Then Return Nothing 'gibts nicht (etwa ein Ordner)
    22. Dim name = DateTime.Now.ToShortDateString & "_" & fi.Name
    23. fi.MoveTo(fi.DirectoryName & "\" & name)
    24. Return fi
    25. End Function
    26. End Class
    Wie gesagt: dein Umbenennungs-Konzept musst du noch überarbeiten, aber wenn du es klar hast, dann kannst du die Umsetzung davon in TryMoveFile plazieren.
    Dateien
    • FileRenamer.zip

      (15 kB, 109 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke ersmal soweit für eure hilfe ;)


    Muss gleich ausm Büro ich schaue mir deinen Code zu hause genauer an ;)




    ich hatte halt gehofft das es geht meinen 2. codeschnipsel irgendwie mit in die for schleife zu packen das er bevor er eine datei umbenennt
    den namen aus der datei nimmt


    irgendwie so...

    erste zeile listbox-->name auslesen-->untr anderem namen speichern-->zeile löschen
    und dan ebend wieder von vorne ;)