Loop in Loop

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Sam85.

    Loop in Loop

    Hallo,

    ich hab da mal eine Frage, ich wollte eine Abfrage folgend gestalten:

    1. Prüfen ob die Datei mit .AUF endet.
    2. Die Datei als x (Name+Pfad) fixieren
    3. Dann weiter prüfen ob eine Datei mit keiner Endung vorhanden ist die gleich bezeichnet ist wie x (die ersten 8 Stellen)
    4. Die Datei als y (Name+Pfad) fixieren.

    Wie muss ich den Loop im Loop korrekt gestalten ?( . So passiert nichts und es kommt auch keine Fehlermeldung. Freue mich über Feedback.

    VB.NET-Quellcode

    1. Dim Pfad As String = "\\rs-win1\Ablage\300archiv\open\" & TA4_IK & "\"
    2. Dim strFilenamex As String, strFilenamey As String
    3. Dim x As String, y As String
    4. Dim files() = New IO.DirectoryInfo(Pfad).GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    5. For Each xfile In files
    6. If xfile.Extension = ".AUF" Then
    7. x = xfile.FullName
    8. strFilenamex = Pfad & x
    9. For Each yfile In files
    10. If yfile.Extension = "" And Strings.Left(yfile.FullName, 8) = Strings.Left(x, 8) Then
    11. y = yfile.FullName
    12. strFilenamey = Pfad & y
    13. End If
    14. Next yfile
    15. Call SendAutoMail(strMail, strBetreff, strMessage, strFilenamex, strFilenamey)
    16. End If
    17. Next xfile

    Sam85 schrieb:

    VB.NET-Quellcode

    1. Dim files() = New IO.DirectoryInfo(Pfad).GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    Du kannst bei GetFiles() die richtige Bedingung reinschreiben, z.B. "1234567*.*", dann werden alle Dateien gelistet, die dieser Bedingung genügen.
    Wenn Du explizit 2 Extensionen testen willst, musst Du das zwei Mal machen.
    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!
    Nutz doch einfach Breakpoint und den Debugger und schau so in die Variablen rein, um die Werte zu sehen.
    AFAICS: Zeile 9 und 10 ergeben murks. xFile.Fullname ist der Dateipfad, also Verzeichnis + Dateiname; in Zeile 10 kombinierst du den Pfad mit dem Pfad => Verzeichnis + Verzeichnis + Dateiname

    btw: Zeile 13: Strings ist Teil des obsoleten VB6-Namespaces
    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.
    @RodFromGermany
    Danke das ist schonmal sehr gut :), nun noch eine Frage...jetzt verschicke ich automatisch durch den Code zwei Mails (erst eine mit Inhalt und dann eine ohne Inhalt). Habe ich noch etwas in der For Schleife falsch gesetzt?

    VB.NET-Quellcode

    1. Dim IMG = Strings.Left(fi.Name, 3)
    2. Dim strFilenamex As String, strFilenamey As String
    3. Dim x As String, y As String
    4. Dim files() = New IO.DirectoryInfo(Pfad).GetFiles("EIMG0" & IMG & ".*", IO.SearchOption.TopDirectoryOnly)
    5. For Each file In files
    6. If file.Extension = ".AUF" Then
    7. x = file.FullName
    8. strFilenamex = file.FullName 'Pfad & x
    9. End If
    10. If file.Extension = "" Then
    11. y = file.FullName
    12. strFilenamey = file.FullName 'Pfad & y
    13. End If
    14. Call SendAutoMail(strMail, strBetreff, strMessage, strFilenamex, strFilenamey)
    15. Next file


    @VaporiZed
    Danke :) hab es auch gerade gesehen File.Fullname gibt den Ganzen Pfad, hab es auf File.Name geändert bzw. das überflüssige Element entfernt.
    Wie kann ich die Left Funktion stattdessen nutzen wenn nicht mit Strings?

    EDIT: OK den Loop hab ich nun so gelöst:

    VB.NET-Quellcode

    1. Dim strFilenamex As String, strFilenamey As String
    2. Dim files() = New IO.DirectoryInfo(Pfad).GetFiles("EIMG0" & IMG & ".*", IO.SearchOption.TopDirectoryOnly)
    3. For Each file In files
    4. If file.Extension = ".AUF" Then
    5. strFilenamex = file.FullName
    6. End If
    7. If file.Extension = "" Then
    8. strFilenamey = file.FullName
    9. End If
    10. Next file
    11. Call SendAutoMail(strMail, strBetreff, strMessage, strFilenamex, strFilenamey)

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

    1. Strings.Left(yfile.Fullname, 8) wird .Net-passend durch yfile.Fullname.Substring(0, 8) ersetzt.
    2. Macht Deine Funktion, was sie soll? Punkt 3 aus Post#1 wird mit dem jetzt gezeigten Code m.E. gar nicht erfüllt, Punkt 2 und 4 eigentlich auch nicht, da bei mehreren Matches u.U. bei SendAutoMail 2 verschiedene Dateien ankommen. Du erzwingst keine Übereinstimmung der beiden. Und wenn Du die ersten 8 Zeichen der Pfade vergleichst, vergleichst Du wahrscheinlich nur Teile des Verzeichnisses (möge der Pfad immer lang genug sein, sonst kommt es zum Crash, wenn es mal ein kürzeres Verzeichnis ist), das weißt Du schon, oder?

    btw: Das Schlüsselwort Call ist in diesem Zusammenhang obsolet und überflüssig, siehe MSDN-Eintrag:

    MSDN schrieb:

    You typically use the Call keyword when the called expression doesn’t start with an identifier. Use of the Call keyword for other uses isn’t recommended.

    Und: Pfad = Verzeichnis + Dateiname =>

    Sam85 schrieb:

    2. Die Datei als x (Name+Pfad) fixieren
    ist nicht das, was Du wirklich willst; aber keine Sorge, das lese ich (nicht nur) hier bei vbp häufiger
    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
    Die Namensübereinstimmung erfolgt in Dim files() = New IO.DirectoryInfo(Pfad).GetFiles("EIMG0" & IMG & ".*", IO.SearchOption.TopDirectoryOnly)
    bei IMG das Segment enthält die Bezeichnung für die Übereinstimmung. Und IMG ist Dim IMG = Strings.Left(fi.Name, 3), was ich morgen dann auf die .NET schreibweise anpassen werde :).

    Fi ist in diesem Fall das Image was stets vorkommt und die Bezeichnung beinhaltet, die auch für die .AUF und ."" Datei zutreffen. Die andere Prüfung ist hier leider nicht sichtbar, kann ich aber gerne morgen nachtragen. Erst wird im Verzeichnis geprüft ob .AUF Dateien im Verzeichnis vorhanden sind. Dann wird anhand des Images die Bezeichnung ermittelt und dann die .AUF und ."" in eine Mail eingefügt. (Hab es auch getestet und die Mails sahen gut aus, alle Pärchen wie ich es mir vorgestellt hatte.)

    Der Pfad wird aus einer Combobox abgerufen und der Inhalt der Combobox sind die vorhandenen Verzeichnisse, sollte dann also keine Schwierigkeiten machen. (Werden auch nur gezeigt wenn es sie gibt)

    Das mit dem Call kann ich dann weglassen :) Das kam mir dann aus dem VBA bekannt vor, der Befehl wird also auch ohne ausgeführt. Danke.
    Ich hab dennoch mal eine andere Frage:
    kann ich für das "E" bei "EIMG0" eine variable erstellen so in der Art {"E","T"} das die Bezeichnung sowohl TIMG0 als auch EIMG0 sein könnte?

    VB.NET-Quellcode

    1. Dim files() = New IO.DirectoryInfo(Pfad).GetFiles("EIMG0" & IMGn & ".*", IO.SearchOption.TopDirectoryOnly)
    @Sam85 Nimm mal den WildCard-Charakter ?, der nimmt aber dann an dieser Stelle alle vorkommenden Zeichen (genau eins): "?IMG0"
    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!
    @RodFromGermany

    ich hab das jetzt mal so probiert aber das funktioniert nicht, wird einfach ignoriert. Oder geht das mit dem ? nur bei Dim files() = New IO.DirectoryInfo(Pfad).GetFiles("EIMG0" & IMGn & ".*", IO.SearchOption.TopDirectoryOnly) ?

    VB.NET-Quellcode

    1. Dim AUFE = "?IMG0" & Lines(6).Substring(4, 3) & ".AUF"
    Solche Wildcards wie * und ? sind Teil eines Strings, die dann von z.B. GetFiles anders interpretiert werden. In der von Dir zuletzt genannten Codezeile ist ein ? einfach nur ein ?. Also ein valides Zeichen innerhalb eines Strings, ohne Zusatzbedeutung. Die Zusatzbedeutung wird immer erst von einer Funktion reininterpretiert.
    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.
    Ist diese Funktion dafür geeignet?

    VB.NET-Quellcode

    1. Private Function check(s As String) As Boolean
    2. Return s = "E" OrElse s = "T"
    3. End Function


    Oder wie kann ich sowas implementieren? True bekomme ich zumindest schonmal...wie erreiche ich nun, das der Wert angezeigt wird?

    VB.NET-Quellcode

    1. Dim MyCheck As String
    2. MyCheck = "E" Like "[A-Z]" Or "T" Like "[A-Z]"
    3. Dim AUFE As String = MyCheck & "IMG0" & Lines(6).Substring(4, 3) & ".AUF"
    4. Dim ZIPE As String = MyCheck & "IMG0" & Lines(6).Substring(4, 3)

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

    Eh, what? Bitte erstmal Option Strict On machen, denn MyCheck = "E" Like "[A-Z]" Or "T" Like "[A-Z]" ist Quark, da MyCheck vom Typ String ist, das Gesums rechts aber einen Wahrheitswert gibt. Was willst Du damit überhaupt erreichen? Der rechte Teil ergibt gar keinen Sinn, sondern immer True, da E zwischen A&Z liegt und T auch.
    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.
    Strict On ist immer an. :thumbsup:

    Zum zweiten, deswegen hab ich es dann wieder gestrichen :saint: war Schmus von mir. Ich muss dann theoretisch statt dem "E" einfach den ersten Substring der File (EIMG0xxx oder TIMG0xxx) ermitteln und den dann Like "E" Or "T" abfragen, oder?
    Was meinst du mit "theoretisch"?
    Und definiere "einfach den ersten Substring der File".



    Ansonsten halte ich Like hier für unangebracht.
    Ist jetzt bisserl dumm, weil durch die vielen Posts bin ich der Anforderung nicht mehr sicher.
    Jedenfalls kann DirectoryInfo.GetFiles einen Filter verarbeiten, zB. *IMG0.AUF, damit wäre die meiste Filter-Arbeit wohl erledigt (wenn ich die Anforderung richtig verstanden habe).
    Dann gibt es noch genau 1 Zeichen vor "IMG0.AUF"?
    Was hindert dich, es zu testen?

    VB.NET-Quellcode

    1. dim startsWithT = myFileInfo.Name(0) = "T"c
    2. 'oder
    3. dim startsWithE = myFileInfo.Name(0) = "E"c

    Oder gefällt dir .StartsWith() besser?

    VB.NET-Quellcode

    1. dim startsWithT = myFileInfo.Name.StartsWith("T")
    2. 'oder
    3. dim startsWithE = myFileInfo.Name.StartsWith("E")

    Danke für eure Unterstützung, konnte das Problem lösen. Aber dafür habe ich eine weitere Frage:
    Und zwar wollte ich das TA4_IK mit einer variablen versehen, die aber immer alle Werte überprüft, die im IK vorhanden sind.
    Wie gehe ich da vor? Also in dem Fall soll die IF Prüfung neben der Länge von prüfen auch alle IK überprüfen. Kann man das, ohne jede IK einzeln in die IF Klausel einzubinden?

    VB.NET-Quellcode

    1. Dim IK As String() = {"661430035","123456789"}
    2. If prüfen.Length > 0 And TA4_IK = IK Then
    3. mailprüfen(New DirectoryInfo(sPfad))
    4. Else

    Sowas ginge mit LINQ sehr gut: If prüfen.Length > 0 AndAlso IK.Contains(TA4_IK) Then
    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.