_FileListToArray

Statement zur DSGVO im Forum

Alles zur DSGVO und zur Umsetzung im Forum hier: Statement zur DSGVO (letztes Update: 30.05.2018)
  • Hallo zusammen,


    ich habe folgendes Problem, und benötige mal eure Hilfe:



    Wie Ihr seht, sind das viele Deklarationen für eigentlich ein und den selben Zweck. Problem hier ist allerdings, dass die Pfade immer unterschiedlich sind.

    Also ich möchte prüfen, ob Plannummern oder Dateibenennungen in Source und Dest doppelt vorhanden sind. Das Thema hatten wir ja schon. Funzt auch soweit ganz gut.


    Meine Frage ist, wie kann ich das ganze eleganter gestalten. Und zwar von der Benennung der Variablen. Ist es nicht möglich $aFileList_Source_erstellen[0] oder $aFileList_Source_erstellen[0][0]

    zu machen? Also ein 1D oder 2D Array?


    Ich habe es ausprobiert. Nur ist das Problem, dass ich dann keine Fehlermeldung bekomme, die eigentlich kommen sollte.


    Habt ihr vielleicht noch eine Idee?


    Danke im Voraus.


    Mfg Mikki

  • Hallo alpines,


    Ja ich weiß. Im Index 0 steht die Anzahl der Elemente. Im Index 1 die erste Datei.


    Aber worauf willst du hinaus?


    Es macht keinen Unterschied bei der Prüfung und bei der Ausgabe der Fehlermeldung. Habe es gerade ausprobiert. Die Anzahl der Fehlermeldungen und auch der Inhalt, also welche Datei doppelt vorkommt, ist gleich.

  • Aber worauf willst du hinaus?

    Wenn das schon in [0] steht dann verwende das auch direkt, ist semantisch konsequenter.


    Ich hab allerdings dein Problem nicht wirklich verstanden, willst du die Abfrage die du gemacht hast für alle Dateiendungen vornehmen? Dann schieb deine Arrays in ein anderes Array und iteriere durch das.

  • Hallo,


    ja korrekt. also für $aFileList_Source_erstellen_plaene_bmf -> $aFileList[0] , für $aFileList_Source_erstellen_plaene_dwg -> $aFileList[1]

    Also im Endeffekt so, dass ich nicht mehr für einen Dateitypen eine Variable habe, sonder dass ich ein Array habe, wo das alles drin ist.

    Würde natürlich dann genau kommentieren was was ist.

  • Aber ich habe immer noch nicht ganz verstanden wie ich das nun machen soll.


    Sorry wenn ich ich dir blöd vorkomme, aber das dauert ein bisschen bei mir ;(.

  • Ja stimmt habe ich ganz verdaddelt.


    also mal hier wie es jetzt aussieht:



    Ich habe jetzt nur noch 4 Variablen. Also $aFileList_Source, $aFileList_Dest, $Dateiname_Source und $Dateiname_Dest.

    Habe diese für sämtliche Dateitypen und Pfade genommen. Funktioniert Einwandfrei. Jede Datei wird korrekt mit Pfad angezeigt, indem sie doppelt vorkommt.


    Mfg Mikki

  • Schön, dass Du das Problem lösen konntest. Man könnte noch mehr Variablen einsparen ($Dateiname_Source, $Dateiname_Dest, $aMsgBox[54][0]), aber das bringt nicht so viel an Geschwindigkeit.

    Falls Du mal mehr Geschwindigkeit brauchst oder es im Source- und/oder Destordner zu voll wird (sehr viele Dateien), dann kannst Du auf das Dictionary-Objekt ausweichen.

    Statt alle Sourcedateien mit allen Destdateien zu vergleichen (zwei ineinander verschachtelte For...Next-Schleifen), geht das mit einem Dictionary um ein Vielfaches schneller.

  • Hast du da ein Beispiel parat?

    Ok, hier mal ein Beispiel:

    Da erhalte ich bei mir als Ergebnis:

    Wie bereits geschrieben: "...um ein Vielfaches schneller." :)

    Und je mehr Dateien in den Arrays vorhanden sind, umso größer wird der Abstand zwischen den beiden Verfahren.

  • Hallo Oscar


    I see :-). Ob es schneller ist muss ich mal testen.


    Aber meiner Meinung nach ist es egal ob ich mit meiner Methode 6 Sekunden benötige, oder mit deiner Methode 2 Sekunden.

    Wir haben maximal 500 Dateien im gesamten Verzeichnis. Und da kommt es auf ein paar Sekunden nicht an.


    Aber Danke für den Post. Ich werde es morgen in Ruhe mal testen :)


    MfG Mikki

  • Falls Du mal mehr Geschwindigkeit brauchst oder es im Source- und/oder Destordner zu voll wird (sehr viele Dateien), dann kannst Du auf das Dictionary-Objekt ausweichen.

    das hört sich interessant an Hast du da ein Beispiel parat?

    Ok, hier mal ein Beispiel:

    Aber meiner Meinung nach ist es egal ob ich mit meiner Methode 6 Sekunden benötige, oder mit deiner Methode 2 Sekunden.

    Wir haben maximal 500 Dateien im gesamten Verzeichnis. Und da kommt es auf ein paar Sekunden nicht an.

    Ich bin froh, dass ich kein Beispiel erstellt habe.. ;)

  • Ich bin froh, dass ich kein Beispiel erstellt habe..

    Sehe ich nicht so dramatisch! :)

    Auch wenn er das im konkreten Fall nicht einsetzen möchte, kann es vielleicht ein Anderer gebrauchen (oder er in einem späteren Projekt).

    Das Prinzip gilt ja nicht nur für Dateien, sondern überhaupt für Arrays, wenn man Doppelte ausfiltern will und sowas kommt ja öfter vor.

  • Auch wenn er das im konkreten Fall nicht einsetzen möchte, kann es vielleicht ein Anderer gebrauchen (oder er in einem späteren Projekt).

    Das Prinzip gilt ja nicht nur für Dateien, sondern überhaupt für Arrays, wenn man Doppelte ausfiltern will und sowas kommt ja öfter vor.

    Das stimmt natürlich. :)

  • Hm... Oscar kann ich Dictionarys auch für GUIControls einsetzen?

    Folgende Ausgangssituation habe ich.


    Ich baue eine GUI mit mehreren eigenständigen "Modulen" (so nenne ich die mal).

    Diese Module besitzen mehrere unterschiedliche Anzahlen an GUI Elementen, die ich alle in jeweils ein Array Speicher.


    Das Ziel ist es, das meine GUI per Hotkey angesprochen wird.

    Jedes mal wenn der Hotkey gedrückt wurde, wird anhand bestimmter Kritierien geprüft welche Module angezeigt werden sollen und welche nicht.

    Sprich, es können immer unterschiedliche Module angezeigt werden.


    Code
    1. Global $GUI_Line[$iModule][3] ;Trennlinien
    2. Global $GUI_Text[$iModule][27] ;Texte
    3. Global $GUI_Input[$iModule][2] ;Inputfelder
    4. Global $GUI_Edit[$iModule][1] ;Edit Felder
    5. Global $GUI_Combo[$iModule][3] ;Combo
    6. Global $GUI_Button[$iModule][19] ;Buttons

    So Initialisiere ich meine Arrays.

    "$iModule" steht hierbei für die Modulnummer (1,2,3,...), bzw. wegen der Initialisierung für die Anzahl an Modulen die ich habe.

    Der weitere Key vom 2DArray steht für die Anzahl an Elementen, leider gebe ich die Array Größe dadurch noch händisch an.


    Jetzt gehe ich so vor.

    Bei einem Druck auf den Hotkey, gehe ich in Schleifen alle Arrays komplett durch und "verstecke" jedes Element.

    Anschließend wird geprüft welche Module angezeigt werden sollen und ich setze neue sichtbare GUI Koordinaten für jedes Element das erscheinen soll.


    Bei dieser Vorgehensweise habe ich mir viel Arbeit beim "Verstecken" der Elemente gespart.

    Beim Anzeigen der Elemente bisher nicht, da ich es trotzdem händisch mache.


    Mein Problem derzeit ist, nicht JEDES Modul besitzt die maximale Anzahl an Elementen (zb. Buttons 19 Stück).

    Trotzdem geht beim "Verstecken" meine Funktion in der Schleife alle, auch ungenutzten 2D Array Elemente durch.

    Mittlerweile merke ich, dass ich hier Einsparungspotentiale habe und merke wie sich die GUI immer langsamer aufbaut, je mehr dazu kommt (logischerweise).


    Kann ich um diese Prozesse zu beschleunigen auch Dictionarys irgendwie einsetzen?


    Hier meine "Hide" Funktion:


  • Trotzdem geht beim "Verstecken" meine Funktion in der Schleife alle, auch ungenutzten 2D Array Elemente durch.

    Prüf ob der Index leer ist und verwende ContinueLoop 2 bzw. ExitLoop.


    Kann ich um diese Prozesse zu beschleunigen auch Dictionarys irgendwie einsetzen?

    Dictionaries haben algorithmisch eine generell kürzere Laufzeit als normale Arrayiterationen, allerdings wird sich dieser Unterschied bei < 100 überhaupt nicht bemerkbar machen.

    Und ich rede nur von der Zeit das Element zu suchen und anzusprechen.


    Springst du aus dem Array raus wenn du einen leeren Index findest (danach kommt ja vermutlich nichts mehr) dürftest du wesentlich schneller unterwegs sein als normal.

  • Oh, das ist auch egt eine super Sache. ^^

    Werde ich so probieren, vielen Dank. :):thumbup:


    Damit ich es richtig nachvollziehe.

    Sobald ich das erste Element erhalte, das bei einem Durchgang leer ist, setze ich "ContinueLoop 2" damit er erst garnicht die restlichen Elemente durchgeht, sondern direkt dieses "Module" des Arrays überspringt?

  • Das kommt darauf an wie du deine Schleifen implementierst.


    ExitLoop würde den Durchlauf der 2. Dimension unterbrechen und mit der Schleife in der 1. Dimension weiterarbeiten.

    ContinueLoop würde den Durchlauf der 2. Dimension unterbrechen aber nicht die aktuelle Schleifeniteration der 1. Dimension durchlaufen sondern erst die nächste.


    Die Zahl bei ExitLoop oder ContinueLoop gibt an auf welchem Level der Befehl stattfinden soll, dabei gilt ExitLoop = ExitLoop 1.