Geschwindigkeit usw...

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

Es gibt 76 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    @VaporiZed

    Moin moin

    Ich habe mal 2 Bilder an gehangen, hoffe das es dadurch verständlicher ist.

    Also bisher klappt das ja: sind die Dateien vorhanden, werden sie in der Listbox aufgelistet.
    Was ich erreichen wollte; eine Art Fehlermeldung, wenn Dateien aus der Suchliste, nicht gefunden / vorhanden sind. Das klappt halt nicht.

    Das nächste was ich noch versuche zu ändern ist der Suchfilter.
    Die Dateien können unterschiedlichste Namen haben aber eins haben sie alle gemeinsame die Zahlen.
    Beispiele: _xyz0001.Endung oder DCS_0012.Endung oder 60N_0012.Endung IMMER 4 Zahlen!!

    Gebe ich nun NUR die Zahlen ein, werden alle Dateien mit den verschiedensten Vorzeichen aufgelistet. Das ist OK.
    Ich bekomme diese Dateinamen aber meisten in voller schreibweise und weiß nun nicht wie ich das mit dem "abschneiden" hier:
    For Each filename As String In Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories)
    einbaue.
    Alles erst per Hand umzuschreiben um dann ins Suchfeld einzugeben macht wenig Sinn oder ? ;)
    Hoffe Du kannst meine Logik nachvollziehen und mir helfen ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Nochemal langsam. Ich nehm Deinen Codeausschnitt nochmal her:

    VB.NET-Quellcode

    1. If System.IO.File.Exists(tempFilePath) Then
    2. Me.Invoke(Sub() listbox(sourceFile & "nicht vorhanden")) '<======== Das macht der code nicht wenn Dateien nicht vorhanden!!
    3. Else
    4. Me.Invoke(Sub() listbox(tempFilePath)) '<====== Das läuft einwandfrei.
    5. If Not Directory.Exists(Klass.Workdir & tempdir) Then Directory.CreateDirectory(Klass.Workdir & tempdir)
    6. File.Copy(filename, tempFilePath, True)
    7. End If

    Dein Code sagt: Wenn die Datei vorhanden ist, schreib in die ListBox "Datei nicht vorhanden". Das ist offensichtlich falsch, denn das ergibt keinen Sinn. Damit schreibst Du eine Lüge in die ListBox rein. Das mit dem "nicht vorhanden" gehört also in den Else-Bereich. Außerdem wird eine Datei kopiert, wenn eine andere nicht da ist. Das versteh ich nicht.

    If Not Directory.Exists(Klass.Workdir & tempdir) Then Directory.CreateDirectory(Klass.Workdir & tempdir)Schau mal in der Doku von Directory.CreateDirectory nach. Da steht drin, dass das Verzeichnis nur angelegt wird, wenn es nicht existiert. Den If-Teil kannst Du Dir damit sparen. Mach aus

    VB.NET-Quellcode

    1. If Not Directory.Exists(Klass.Workdir & tempdir) Then Directory.CreateDirectory(Klass.Workdir & tempdir)
    einfach

    VB.NET-Quellcode

    1. Directory.CreateDirectory(Klass.Workdir & tempdir)


    Tu uns (inkl. Dir) einen Gefallen. Erklär mal bitte Codezeile für Codezeile, was detailliert pasiert bzw. passieren soll, angefangen bei dieser Zeile in Post#37 (Zeile#18) bis zum entsprechenden Next.
    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.

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

    @VaporiZed

    OK ich versuche es zu erklären.
    Habe heute einges versucht aber immer mit dem Resultat, das immer nur in einen Zweig der If Else gegangen wurde.
    Im Moment habe ich das ganze If Else rausgeschmissen.

    VB.NET-Quellcode

    1. For Each line In tb_auswahl.Lines '<=== Textbox mit Einträgen
    2. Dim source As String = line
    3. '<= Nimm den Namen aus der Liste(Lines) und suche die Datei mit der Entsprechenden Endung
    4. For Each filename As String In Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories)
    5. Dim sourceFile = Path.GetFileName(source & FileExtension)
    6. '<= Mache aus der gefundenen Datei einen neuen Dateipfad
    7. Dim tempFilePath = Klass.Workdir & tempdir & sourceFile
    8. If System.IO.File.Exists(tempFilePath) Then
    9. '<= Wenn die datei aus der Liste(Lines) auch gefunden wurde, trage es in die ListBox ein
    10. ' wenn das neue Verzeichnis ( Dateipfad ) noch nicht da ist, erstelle es
    11. ' und kopiere die Datei ins neue Verzeichnis
    12. Me.Invoke(Sub() listbox(tempFilePath))
    13. Directory.CreateDirectory(Klass.Workdir & tempdir)
    14. File.Copy(filename, tempFilePath, True)
    15. Else
    16. '<= Wird die Datei aus der Liste(Lines) nicht gefunden, trage in die Listbox ein
    17. Me.Invoke(Sub() listbox(sourceFile & "Datei(en) nicht vorhanden"))
    18. End If
    19. Next
    20. Next
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Das sind mir zu viele Spekulatiusstückchen.
    Also füge ich mal ein paar Daten ein und Du sagst mir, ob das plausibel ist.
    in tb_auswahl (ausbaufähiger Control-Name; ist das ne TextBox?) steht drin:

    Quellcode

    1. UserNames
    2. CodeFiles
    3. Manual

    tb_eingabe (ganz schlechter Control-Name) ist wohl für das Quellverzeichnis, z.B. E:\Quelle
    Dann steht im Code also:
    • Gehe alle Zeilen in der tb_auswahl durch.
    • Such mir für jeden Eintrag darin die Dateien mit dem Namen (also zuerst "UserNames") mit der (irgendwo) angegebenen Extension. Wenn es also eine UserNames.dat und eine UserNames.txt gibt, werden die jetzt hergenommen.
    • speichere in sourceFile den Dateinamen und die Extension (also UserNames.dat)
    • speichere in tempFilePath einen ominösen Pfad - keine Ahnung was WorkDir und tempDir ist, ich sag mal D:\Ziel\UserNames.dat
    • wenn dieser Dateipfad D:\Ziel\UserNames.dat existiert, dann schreib ihn in die ListBox, erstelle das Verzeichnis D:\Ziel\ - eh Moment. Das Verzeichnis muss schon exisieren, sonst würde der Dateipfad nicht existieren :!:
    • kopiere die Datei zum Zielpfad, also von E:\Quelle\UserNames.dat nach D:\Ziel\UserNames.dat
    • wenn der ominöse Pfad D:\Ziel\UserNames.dat nicht exisiert, schreibe E:\Quelle\UserNames.dat in die ListBox
    Sollte so passen. Ob es das ist, was Du willst, musst Du entscheiden.
    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

    ​tb_auswahl ist eine Textbox mit einem FolderBrowserDialog wo ich den Pfad angebe aus dem die Dateien gesucht und kopiert werden sollen. (Sourcepath)
    tb_eingabe ist die Textbox (Multiline) in der die Namen (Dateinamen ohne Endung) reingeschrieben werden die gesucht werden sollen.
    Diese Dateien können verschiedene Endungen haben und die Namen können verschieden aufgebaut sein.
    z.B.: _GH0001.jpg oder df_0023.cr2 Alles was diese Dateien im Namen gemeinsam habe ist die 4Stelliige Zahl. Das ist sourcefile

    Die entsprechende Extension wähle ich mittels RadioButton aus.

    Jetzt sollen diese Dateien von der einen Source-Festplatte/USB-Stick z.B. ( G:\ ) in das Arbeitsverzeichnis auf dem Computer kopiert werden.
    Workdir ist die Festplatte ( D:\) und tempdir das Verzeichnis ( \temp )

    Also quasi:
    Nimm _df0023.jpg von G:\ und kopiere diese nach D:\temp
    Das mit den Dateiendungen ist wichtig, weil es z.B. so sein kann, das in G:\ eine Datei _df0023.jpg und eine Datei _df0023.cr2 liegen kann.
    Es kann auch sein, das nur die _df0023.jpg vorhanden ist, ich aber nur die _df0023.cr2 brauche/suche!

    Deswegen soll dann in der Listbox der Eintrag kommen
    a.) das die datei kopiert ist
    b.) oder eben nicht kopiert ist weil nicht vorhanden
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Dann müsste wohl der Code so aussehen:

    VB.NET-Quellcode

    1. For Each line In tb_auswahl.Lines
    2. Dim source As String = line
    3. For Each filename As String In Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories)
    4. Dim sourceFile = Path.GetFileName(source & FileExtension)
    5. Dim tempFilePath = Klass.Workdir & tempdir & sourceFile
    6. Directory.CreateDirectory(Klass.Workdir & tempdir)
    7. Me.Invoke(Sub() listbox(tempFilePath))
    8. File.Copy(filename, tempFilePath, True)
    9. Next
    10. Next

    Denn: Wieso sollte die Datei nicht gefunden werden, wenn sie doch über GetFiles ermittelt wurde? Oder geht es darum, dass die Datei nicht kopiert werden soll, wenn sie schon am Ziel ist? Was hat das dann aber mit "Datei nicht gefunden" zu tun? Welche Datei kann nicht gefunden werden? Nenn mal bitte ein konkretes Beispiel, bei dem eine Datei nicht gefunden wird.
    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

    Dies war mein letzter Code der ohne das ganze If Else funktioniert. Halt nur das eben nicht angezeigt wird, wenn eine gesuchte datei NICHT gefunden wurde.
    Beispiel:
    Auf dem USB-Stick sind 100 Dateien. Wild gemischt. sowohl xxxxx.jpg alsauch xxxxx.cr2
    Nun habe ich eine Liste von sagen wir 10 Dateien, diese gebe ich ein und lasse suchen . Ich brauche aber nur die XXXXX.CR2 nicht die gleichlautende XXXXX.JPG.
    Wenn nun nur die xy.jpg vorhanden ist aber die xy.cr2 nicht müsste die Meldung kommen das eine Datei nicht gefunden wurde.

    VB.NET-Quellcode

    1. Private Sub copyfiles()
    2. Extension()
    3. If FileExtension = Nothing Then
    4. Dim übergabe As String = "nefcr2arwjpg"
    5. MessageBox.Show("Bitte Dateityp auswählen", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    6. Exit Sub
    7. End If
    8. Try
    9. tempdir = "\" & tb_eingabe.Text.Substring(3) & "\"
    10. Me.BeginInvoke(Sub() PBcopy.Visible = True)
    11. For Each line In tb_auswahl.Lines
    12. Dim source As String = line
    13. For Each filename As String In Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories)
    14. Dim sourceFile = Path.GetFileName(source & FileExtension)
    15. Dim tempFilePath = Klass.Workdir & tempdir & sourceFile
    16. Me.BeginInvoke(Sub() lb_worktarget.Items.Add(tempFilePath))
    17. Directory.CreateDirectory(Klass.Workdir & tempdir)
    18. File.Copy(filename, tempFilePath, True)
    19. Next
    20. Next
    21. Threading.Thread.Sleep(1000)
    22. Me.BeginInvoke(Sub() PBcopy.Visible = False)
    23. Catch ex As Exception
    24. MessageBox.Show("Fehler: " & ex.ToString)
    25. End Try
    26. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Einer von uns hat einen Denkfehler. For Each filename As String In Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories) wird nur die Dateien durchgehen, die auch wirklich da sind. Wenn Du damit nach einer Datei suchst, die so nicht exisiert, dann wird dafür die Schleife auch nicht ausgeführt. Die Datei wird komplett ignoriert.
    Ein Beispiel:
    Du hast Dein Verzeichnis G:\ mit den Dateien AAA.jpg, AAA.cr2 und BBB.jpg und Du suchst mit For Each filename As String In Directory.GetFiles(…), dann wird diese Schleife 3x ausgeführt. Beim ersten mal steht die Datei AAA.jpg in filename drin, beim 2. Mal AAA.cr2 und beim 3. Mal BBB.jpg. Aber NIE BBB.cr2. Mit dieser Schleife werden keine Dateien gefunden, die nicht exisieren.

    Du kannst das eigentlich nur so abfangen:

    VB.NET-Quellcode

    1. If Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories).Count = 0 Then Me.BeginInvoke(Sub() lb_worktarget.Items.Add($"Die Datei {source & FileExtension} gibbet nüsch."))

    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

    dann wird dafür die Schleife auch nicht ausgeführt. Die Datei wird komplett ignoriert.

    Genau das ist das Problem was ich nicht gelöst bekomme.
    Teste dein Code nachermal durch. ;)




    @VaporiZed

    Nö geht nicht. Fehlermeldung: Count ist kein Memberr von System Array

    Und diese Variante geht auch nicht.

    VB.NET-Quellcode

    1. If Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories) Is Nothing Then Me.BeginInvoke(Sub() lb_worktarget.Items.Add("Die Datei {source & FileExtension} gibbet nüsch."))


    Beiträge zusammengefasst ~VaporiZed
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Visual Studio kann nicht nur meckern, sondern auch konstruktive Vorschläge machen ;)
    Bilder
    • Proposal.png

      14,47 kB, 732×181, 38 mal angesehen
    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.
    Nee. Wenn Du Code kopierst, dann richtig.
    Nicht
    lb_worktarget.Items.Add("Die Datei {source & FileExtension} gibbet nüsch.")
    sondern
    lb_worktarget.Items.Add($"Die Datei {source & FileExtension} gibbet nüsch.")
    Da ist ein Dollarzeichen nach dem Add, was zu einer interpolierten Zeichenfolge führt und die Bedeutung verändert. Probier es mal. ;)

    Dass mein Codevorschlag nicht funktioniert, kann ich ohne Gesamtcode nicht erklären. Bei mir funktioniert's. Was Deinen Vorschlag zunichte macht: Du wolltest doch in allen Verzeichnissen suchen. Das geht mit Deinem If File.Exists(source & FileExtension) = False nicht. Der sucht ja nur in einem Verzeichnis.
    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

    Also das $ habe ich entfernt weil ich einen Fehler angezeigt bekomme. " Ungültiges Zeichen " Nicht mehr und nicht weniger kommt vom Studio als Hilfe.
    Den Verweis habe ich drin.

    VB.NET-Quellcode

    1. For Each line In tb_auswahl.Lines
    2. Dim source As String = line
    3. For Each filename As String In Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories)
    4. Dim sourceFile = Path.GetFileName(source & FileExtension)
    5. Dim tempFilePath = Klass.Workdir & tempdir & sourceFile
    6. If Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories).Count = 0 Then Me.BeginInvoke(Sub() lb_worktarget.Items.Add($"Die Datei {source & FileExtension} gibbet nüsch."))
    7. Me.BeginInvoke(Sub() lb_worktarget.Items.Add(tempFilePath))
    8. Directory.CreateDirectory(Klass.Workdir & tempdir)
    9. File.Copy(filename, tempFilePath, True)
    10. Next
    11. Next
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Mit welchem Uralt-.NET-Framework arbeitest Du? 4.0?
    Naja, dann eben lb_worktarget.Items.Add("Die Datei " & source & FileExtension & " gibbet nüsch.")

    Eh. Schau nochmal in Post#49. Die For-Schleife wird für nichtexistente Dateien NICHT ausgeführt. Die If-Abfrage gehört also nicht in die For-Schleife, sondern davor.

    VB.NET-Quellcode

    1. For Each line In tb_auswahl.Lines
    2. Dim source As String = line
    3. If Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories).Count = 0 Then
    4. Me.BeginInvoke(Sub() lb_worktarget.Items.Add("Die Datei " & source & FileExtension & " gibbet nüsch."))
    5. Continue For 'man kann diese Zeile auch weglassen, damit sieht man aber SOFORT, dass der weitere Code nicht für diese Datei ausgeführt wird
    6. End If
    7. For Each filename As String In Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories)
    8. Dim sourceFile = Path.GetFileName(source & FileExtension)
    9. Dim tempFilePath = Klass.Workdir & tempdir & sourceFile
    10. Me.BeginInvoke(Sub() lb_worktarget.Items.Add(tempFilePath))
    11. Directory.CreateDirectory(Klass.Workdir & tempdir)
    12. File.Copy(filename, tempFilePath, True)
    13. Next
    14. Next


    ##########

    Und dann hat man das GetFiles doppelt und kann es somit zusammenfassen:

    VB.NET-Quellcode

    1. For Each line In tb_auswahl.Lines
    2. Dim source As String = line
    3. Dim FittingFiles = Directory.GetFiles(tb_eingabe.Text, "*" & source & FileExtension, SearchOption.AllDirectories)
    4. If FittingFiles.Count = 0 Then
    5. Me.BeginInvoke(Sub() lb_worktarget.Items.Add("Die Datei " & source & FileExtension & " gibbet nüsch."))
    6. Continue For 'man kann diese Zeile auch weglassen, damit sieht man aber SOFORT, dass der weitere Code nicht für diese Datei ausgeführt wird
    7. End If
    8. For Each filename As String In FittingFiles
    9. Dim sourceFile = Path.GetFileName(source & FileExtension)
    10. Dim tempFilePath = Klass.Workdir & tempdir & sourceFile
    11. Me.BeginInvoke(Sub() lb_worktarget.Items.Add(tempFilePath))
    12. Directory.CreateDirectory(Klass.Workdir & tempdir)
    13. File.Copy(filename, tempFilePath, True)
    14. Next
    15. Next
    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.

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

    @VaporiZed

    VisualStudio 2013 mit Net. 4.51 auf Windows 7 SP3 - 64Bit - 16GB RAM - Core-I3

    Dein letzten Code scheint beim ersten durchlauf zu funktionieren.
    Das mit der If vor dem For Each hatte ich ja auch schon in anderer Form versucht ... :(


    ############
    OK noch kürzer der Code ;)
    Hab jetzt noch mein Zähler eingebaut ... klappt auch ;)

    Was meintest du mit "schlechten" Namen für die Textboxen etc???
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Naja, mal sollte schon erkennen, wofür ein Control ist. tb_Eingabe - hm, ok, ich kann da was eingeben bzw. der User hat da was eingegeben. Aber was? Das sollte man aus dem Controlnamen schon erfahren. Also wäre m.E. besser: tb_Quellverzeichnis bzw. tb_SourceDirectory*. Oder eigentlich gar tb_Quellverzeichnispfad bzw. tb_SourceDirectoryPath*, aber man kann's auch übertreiben. :D
    Und tb_auswahl? Naja, wieso Auswahl? Der User kann mit CheckedListBoxen, CheckBoxen, RadioButtons, … was auswählen. Aber in ner TextBox stehen Dinge drin -> tb_zuSuchendeDateinamen bzw. tb_FileNamesToLookFor.
    ABER: Du musst Dich in Deinem Code auskennen. Gemeckert wird wohl nur von dem, der es zu lesen bekommt. Und im Forum sind das ziemlich viele. Aber in z.B. drei Monaten kannst Du das auch selbst sein, die mit dem Code selber nicht klarkommt, weil Du heute z.B. komische Controlnamen verwendet hast. ;)

    * ich verwende nur englische Begriffe im Code. User-sichtbare Texte sind aber natürlich deutsch.
    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.
    Hmm.. Ja ich tue mich immer schwerr mit solchen Namen, auch für Variablen usw....
    Vielleicht fehlt mir einfach die Übung... oder mein AA hindert mich ;)
    Ich versuche es zu verbessern
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @petaod

    hi
    Schon öfters hier kundgetan, das mein PC mit Win10 sooooooooooooo lahm wird; trotz 16GB RAM und deswegen lasse ich es wie es ist.
    Wenn ich mal viel Geld über habe, kann ich mir evtl mal einen neuen PC zulegen.

    ABER: Danke für die Info mit den "Interpolierten Strings"
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: