Filter für FileListToArray

  • Hallo Gemeinde,

    so ganz verstehe ich wohl die Funktion FileListToArray nicht :


    im Scriptdir sollte eine Datei stehen mit Namen UUID-Rechnername.txt. Wenn die Datei nicht existiert, wird bei mir @error auf 1 gesetzt anstatt auf 4.
    kann sich das jemand erklären? Ist der Filter falsch? Und warum wird _Arraydisplay nicht ausgeführt?

  • hipfzwirgel 8. März 2022 um 14:12

    Hat den Titel des Themas von „Filter für FileListtoArray“ zu „Filter für FileListToArray“ geändert.
  • 1. Wenn deine Datei nicht vorhanden ist, passt der Filter nicht mehr und damit der Pfad nicht mehr. Das führt zu @error 1

    2. Wenn er keinen Pfad hat, bekommst du kein Array zurück, deshalb funktioniert ArrayDisplay nicht

    Edit: Nach meiner Auffassung also eher so (ich gehe davon aus das dies in einer Funktion gekapselt ist):

    6 Mal editiert, zuletzt von Moombas (8. März 2022 um 15:18)

  • Hallo Moombas,

    vielen lieben Dank für deine Antwort.

    Was ich aber immer noch nicht verstehe, ist die Tatsache das @error = 4 ja bedeutet, keine Datei gefunden. Somit müsste er doch in den Case 4 springen.

    Bedeutet das, dass FileListToArray aus @ScriptDir und dem Filter eine Pfadangabe erstellt und er dann feststellt, dass dieser Pfad nicht existiert? Dann würde dein Beispiel ja auch nicht gehen, da in dem Ordner ausser der
    UUID-Rechnername.txt( "Rechnername" ist immer der jeweilige Rechnername auf dem das Script ausgeführt wird) keine weitere Textdatei im Regelfall vorhanden ist. Das würde aber dem HilfeText zu Filelist... widersprechen, da Suchen nach einer bestimmten Datei somit nie funktioniert. Auch stimmt die Rückgabe so nicht, da der Pfad @Scriptdir ja richtig ist. Er findet ja nur nicht die gesuchte Datei => ergo Case 4...

    Mach ich da einen Denkfehler :?::?::?: Wenn ja welchen :?:

  • Dem Programm ist herzlich egal ob dein Filter eine Datei oder einen Ordner meint. Wenn dein Filter zum Ergebnis hat, das das Array am Ende leer ist, da gar keine passende Datei gefunden wurde. Ein leeres Ergebnis ist mit einem ungültigen Pfad in diesem Fall gleich gestellt. (Meine Interpretation, bitte korrigieren wenn falsch)

    Das widerspricht nicht unbedingt dem Hilfetext, da dieser davon ausgeht, du hast Xmal eine Datei, die deinem Filter entspricht und nicht im schlimmsten Fall gar nicht.

    Edit: Ich denke du brauchst eher die Funktion FileFindFirstFile('UUID-*.txt')

  • Mach ich da einen Denkfehler :?::?::?: Wenn ja welchen :?:

    _FileListToArray liefert als @error den Fehler 4, falls keine Files passend zum Filter gefunden werden.

    _ArrayDisplay($FileList) setzt @error aber wieder erneut, hier auf @error: 1 - $aArray is not an array .

    Du musst @error nach _FileListToArray also zwischenspeichern und den Wert im Case... verwenden.

    EDIT : hipfzwirgel

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Wie Musashi geschrieben hat.

    Du hast den Switch auf _Arraydisplay gemacht und nicht auf _FileListtoArray aber Case 0 ist ja wenn du eine Array hast also würde ich das so machen.

    If not :?: then ?( else :thumbup:

  • Hallole,

    ohhhh Mann, klarer Fall von den Bäumen und dem Wald. X( ich bin ja so dusselig. :rofl: Klar setzt _Arraydisplay ja auch @error.
    Vielen lieben Dank für insbesondere diesen Hinweis. :klatschen: Aber natürlich möchte ich mich auch für all die anderen Ideen bedanken :thumbup:
    Ich hatte _Arraydisplay nur zur Kontrolle eingesetzt gehabt um zu sehen welche Werte im Array so kommen können. Ohne geht es wieder wunderbar.

    Ist es in Autoit generell so, dass Funktionen(z.B. Stringsplit) die ein Array als Rückgabe haben, kein leeres Array zurückgeben?
    ich hatte damit nämlich schon mal gekämpft...

  • Ist es in Autoit generell so, dass Funktionen(z.B. Stringsplit) die ein Array als Rückgabe haben, kein leeres Array zurückgeben?

    Also zumindest Stringsplit gibt schon ein leeres Array zurück, aber der Rückgabewert ist vom Typ Array, siehe :

    AutoIt
    #include <array.au3>
    Local $sStr = "", $aArr
    $aArr = Stringsplit($sStr, "", 2) ; 2 = $STR_NOCOUNT
    If IsArray($aArr) Then
        MsgBox(0, "", "IsArray = TRUE" & @CRLF)
    Else
        MsgBox(0, "", "IsArray = FALSE" & @CRLF)
    EndIf
    _ArrayDisplay($aArr)

    Eine weitere Anmerkung zu @error ( (beim @extended-Makro ähnlich) :

    Selbst ein zusätzliches ConsoleWrite setzt das @error-Makro zurück, obwohl in der Hilfe dazu kein ReturnValue angegeben wird.

    Da man ConsoleWrite's, z.B. während des Debuggings, gerne mal zwischenschiebt, kann man so leicht in eine Falle laufen.

    Die Auswertung/Ausgabe von @error muss also direkt nach dem jeweiligen Funktionsaufruf erfolgen. (Alternativ, wie beschrieben, das @error-Makro in einer eigenen Variable sichern)

    Hier mal ein schnelles Beispiel zur Verdeutlichung :

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Kleine Einschränkung hierzu: Seit Version 3.3.16.0 >>wurde dieses Verhalten abgestellt<<.

    Oh, vielen Dank, das habe ich noch gar nicht gesehen :) .

    3.3.16.0 (6th March, 2022)

    Added: ConsoleWrite() preserves the @error and @extended.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo Gemeinde,

    ich haben eben mit Musashis "Array-Code" $aArr = _FileListToArray(@ScriptDir, 'UUID-*.txt', 1) getestet und die Txt-Datei gab es nicht.
    Er geht auf False => Ergo: _FileListToArray gibt KEIN leeres Array zurück.

    Wäre hilfreich wenn das in der Hilfe stehen würde...

  • Hallo Moombas,

    ich nutze FileFind... nicht, weil da nur 1 oder -1 zurückkommt. Bei FileListToArray habe ich auch den Namen der Datei im Array und diesen Namen, der immer ein anderer sein kann, benötige im weiteren Verlauf für einige andere Aktionen, des Programmes...

  • Das ist so nicht richtig, du bekommst ein Handle zurück bzw wenn nicht vorhanden -1.

    Den Dateinamen solltest du dann mit FileFindNextFile() bekommen.

    Und ich finde es ist kürzer mit weniger Abfragen:

    Ggf. aber Geschmackssache.

    Edit nur was korrigiert.

    Einmal editiert, zuletzt von Moombas (10. März 2022 um 14:55)