Warte auf Datei script #Fragenmachtspaß

  • Hai Ho wiedermals!
    Ich hab so spaß im moment am programmieren und sitze an einem neuem Projekt das ich zu lösen versuch.

    Stellt euch vor, in einem Ordner taucht auf unbestimmte Zeit 1ne oder mehere Datein mit der selben endung auf.
    Allerdings weiß ich nicht wann das geschieht und denke an ein Program das in diesen Ordner schaut und nach datein mit der Endung schaut.
    Sollte nach ungewisser zeit noch eine datei mit der endung auftauchen sollte das Programm das in sein Array aufnehmen und das ganze in eine kleine ListView eintragen.
    Allerdings fehlt mir noch die springende idee um das umzusetzen.

    Ich dachte an eine While die alle gefundenen dateien auflistet, aber nicht doppelt einträgt, und diese dann ausgibt an die listview. ?(

    ich belese mich derweil zu Arrays da ich damit noch nie vorher gearbeitet habe.

    Probleme bereitet mir der gedanke dass, das array Informationen aufnehmen soll die noch nicht vorhanden sind :huh:

    Also geht meine Frage an die Array Meister des Forums :thumbup:^^

  • Damit werden neue hinzugefügt. Umbenennen wird irgendwie nicht wahrgenommen, erst wenn ne neue Datei dazukommt.
    Aber damit kannst du bestimmt weiterarbeiten :)

  • Ich bin gerade etwas blöd. Ich versuche herauszufinden für was diese UBound($arDatatypes)-1 ;<--- "-1" Steht, Wenn ich das korrekt verstehe, wird das array kreiert mit $arDatatypes=["au3"], aber aber da ist "au3" doch der 0 Wert, also wie kann es um eins veringert werden? Ich blicks wohl im moment nicht. Tut mir leid wenn ich mich blöd stell, ich versuche arrays und dessen umgang erst zu verstehen, verzeiht mir bitte. 8o

    Edit:
    achso na klar die -1 steht dafür das es keine finale Anzahl für die Variable gibt, oder? Ich bin mir nicht sicher

    Damit werden neue hinzugefügt. Umbenennen wird irgendwie nicht wahrgenommen, erst wenn ne neue Datei dazukommt.
    Aber damit kannst du bestimmt weiterarbeiten :)

    AutoIt
    Global $iWidth=800,$iHeight=600,$arDatatypes=["au3"],$sFolder="C:\Users"
    
    
    for $i=0 to UBound($arDatatypes)-1 step 1
  • Das script hat mich mental fertig gemacht so das ich es ein paar tage liegen lassen habe, aber ich will endlich verstehen, also auf ein neues.

    ich stecke wohl noch fest, auch wenn ich das Tutorial von Bugfix über arrays am lesen bin glaube ich nicht ganz das mir das helfen wird.
    Vielleicht sehe ich einfach irgendetwas nicht.

    Ich hab das ganze Script bearbeitet nachdem es nicht Ging. Dabei habe ich es dann wohl komlett zerstört also hab ich es mir erneut kopiert und versuch es auf ein neues.
    local $arTmpFiles = _FileListToArray($sFolder,"*."&$sDatatype,1) gibt kein array aus wenn es keine dateien gibt, das macht mir aber fast garkeine sorgen.

    Das Script nach meinem belieben angepasst.:

    Probleme macht mir sowohl zeile 30 da ich nicht sicher bin ob [$i] beabsichtigt dahin gehört oder es einfach ein fehler ist, als auch
    Zeile 38(und wohl dann auch 42). Ich hab die Zeile 26 von 'UBound($arTmpFiles)-1[1]' zu 'UBound($arTmpFiles[1])-1' geändert da mir nicht klar ist was [1] am ende machte.


    Der fehler der auf 38 entsteht ist dieser:

    Code
    ==> Subscript used on non-accessible variable.:
    $arFiles[$iCount][0]=$arTmpFiles[$i]
    $arFiles^ ERROR

    ich frage mich auf welche variable $iCount zugreift, auf [0]? Und warum dann nochmal [0] dahinter, 2Dim?
    $arfiles ist kein Array, vielleicht ein Fehler der durch meine änderung bei 26 kommt.

    Ohne diese änderung kommt allerdings dieser fehler:

    Code
    ==> Subscript used on non-accessible variable.:
    local $arFiles = UBound($arTmpFiles)-1[1]
    local $arFiles = UBound($arTmpFiles)-1^ ERROR

    & aus dem werde ich nicht schlau.


    Sicher ist der Fehler wahnsinnig einfach & ihr denkt euch das vielleicht auch, aber ich verzweifel hier

    Ich Grüße alle Nachtfüchse in dieser Schönen Nacht!

    EDIT: ich hab zeile 35 vergessen. Sollte 'if NOT $found Then' nicht eher so aussehen 'if NOT $found = true/false then' ? Bin ich zu Stupide?

    • Offizieller Beitrag

    Das ist alles viel zu umständlich!
    Mit "_WinAPI_ShellChangeNotifyRegister" und einem ScriptingDictionary-Objekt (um die doppelten Einträge auszufiltern) ist das Ganze viel kürzer und einfacher zu machen:

  • Zeile 26 (local $arFiles = UBound($arTmpFiles[1])-1 ;<==== UBound($arTmpFiles)-1[1])
    muss local $arFiles[UBound($arTmpFiles[1])][1] sein, denn der Befehl zum füllen der Listview braucht ein 2D-Array (Je Spalte ein Eintrag, deshalb 2D, auch wenn nur 1 Spalte vorhanden ist, deshalb [1]). Ansonsten die Anzahl Zeilen, so viele, wie Dateien gefunden wurden.

    Das IF NOT $found Then heißt, wenn found nicht wahr ist, also in der Schleife oben nicht gefunden wurde, soll der Eintrag hinzugefügt werden. du kannst =false dorthinschreiben, aber bei Variablen vom Typ bool ist das nicht notwendig. (Generell ist in AutoIt alles, was nicht 0 ist TRUE. Du kannst also auch nen String dort reinpacken und der wäre immer TRUE.)

    ReDim sorgt dafür, dass alle Leeren Zeilen am Ende gelöscht werden, denn alle bereits gefundenen Dateien (die schon in der Listview sind) werden nicht ins Array geschrieben. Man könnte auch einfach _ArrayAdd benutzen, wenn eine Datei hinzugefügt wird, das ist aber sehr unperformant, da jedesmal dass Array neu erstellt wird und der gesamte Inhalt des Bisherigen kopiert wird. Das passiert hier nur 2x.

    Die Variante von Oscar ist in jedem Fall performanter, da es nur auf Windows-Events reagiert.

  • @Oscar Gute Idee, ich werde dieses Script studieren und mal sehen was WinApi noch alles bereitstellt. Immer wieder interessant zu sehen das es soviele möglichkeiten gibt Lösungen zu finden ^^ Dankeschön!
    @Kanashius Deine art zu Programmieren ist der, der meinen noch weit überlegen, vielleicht stell ich mich aber auch nur zu dumm an. Ich notiere mir also das ein 2Dim gefordert wird. Ich werde noch viel lernen. Dankeschön!

    • Offizieller Beitrag

    Der Vorteil bei meinem Script ist, dass es die meiste Zeit nichts zu tun hat (Prozessorlast nahe Null).
    Erst wenn sich in dem zu überwachenden Verzeichnis etwas ändert (eine Datei neu erstellt oder geändert wird), bekommt das Script von Windows eine Meldung mit dem Pfad zu der Datei, die sich geändert hat.
    Und mit Hilfe des ScriptingDictionary überprüfe ich dann nur, ob sich genau diese Datei bereits im Listview befindet. Wenn nein, dann hinzufügen. Der große Vorteil bei dem Dictionary ist die Geschwindigkeit. Je mehr Dateien dort aufgenommen werden, umso größer ist der Geschwindigkeitsvorteil gegenüber einem Array. AutoIt braucht relativ lange, um ein umfangreiches Array nach doppelten zu durchsuchen. $oDictionary.Exists($sPath) ist dagegen sehr schnell.
    Ich sehe aber gerade, dass Du ja eigentlich nicht alle Dateien aufnehmen willst, sondern nur die mit einer bestimmten Endung.
    Aber ich denke, diese Änderung an dem Script kann ich Dir dann als Aufgabe mitgeben. :)