FileFindFirstFile zu "fleißig" ?

  • Servus

    Ich suche Dateien (in best. Ordnern) mit einer bestimmten Erweiterung:

    [autoit]

    $search = FileFindFirstFile("d:\test\*.abc")
    $file = FileFindNextFile ($search)
    while $file
    machwas ()
    $file = FileFindNextFile ($search)
    wend

    [/autoit]

    Das funktioniert zwar, aber es werden aber auch Dateien mit der Erweiterung "abc@" gefunden (vielleicht auch noch andere? - ich hatte zufällig *.abc@-Files im Ordner).
    Mein Fehler? korrigierbar? oder muss ich mich damit abfinden und zusätzliche Abfragen einbauen?

    Und noch eine zweite Frage weils grad dazu passt:

    [autoit]

    $file = FileFindNextFile ($search)
    while $file

    [/autoit]


    funktioniert, nicht aber:

    [autoit]

    while $file = FileFindNextFile ($search)

    [/autoit]


    Verschachtelungen sind doch (grundsätzlich?) möglich? Oder nur unter bestimmten Vorausetzungen (nicht)?

    SG, entsel

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

    Einmal editiert, zuletzt von entsel (22. Januar 2012 um 18:20)

  • Zur ersten Frage:

    Zitat aus der Hilfe:

    Zitat

    "Wenn eine 3 Zeichen lange Endung verwendet wird, passt jede mit diesen 3 Zeichen beginnende Endung, z.B. passt "test.log_1" bei "*.log". (in der Dokumentation von Microsoft auch nicht beschrieben)."


    Daran lässt sich wohl nichts ändern.

    Zur zweiten Frage:
    Wenn du das so machst, prüft er ob das Resultat von FileFindNextFile gleich ist wie $file. Er führt nicht eine Zuweisung durch. Deshalb ist es nicht möglich innerhalb von z.B. While Schleifen oder If Abfragen Zuweisungen durchzuführen.

    Gruss Shadowigor

  • Würde dies auch funktionieren?

    Spoiler anzeigen
    [autoit]

    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Pfad = "Pfad zu deiner Datei"
    $endung = ".abc"
    $aFiles = _FileListToArray($Pfad)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aFiles[0]
    $regExp = StringRegExp($aFiles[$i],"(.+\."& $endung &")",3)
    If IsArray($regExp) Then
    MsgBox(0,"",$regExp[0])
    EndIf
    Next

    [/autoit]

    Dort werden alle Dateien im angegebenen Ordner ausgelessen und in einen Array geschrieben. Danach
    wird per StringRegExp überprüft ob die Datei die Endung beispielsweise .abc hat.

  • In deinem 1. Beispiel erzeugst du eine Endlossschleife die (wenn in "machwas()" nicht noch was anderes steht) nie beendet wird.
    Du musst daher noch prüfen ob FileFindNextfile nicht schon am Ende ist und gegebenenfalls die Schleife dann beenden.
    Den Punkt mit der Dateiendung hat shadowigor dir ja schon beantwortet.
    Am schnellsten solltest du kommen wenn du einfach vom Dateinamen die letzten Buchstaben vergleichst.

    Vollständig sollte das dann ungefähr so aussehen:

    Spoiler anzeigen
    [autoit]

    $h_search = FileFindFirstFile("d:\test\*.abc")
    Do
    $s_File = FileFindNextFile($h_search)
    If @error Then ExitLoop
    If StringRight($s_File, 4) <> ".abc" Then ContinueLoop
    machwas()
    Until 0

    [/autoit]


    Würde dies auch funktionieren?


    Fast - auf der einen Seite müsstest du noch den Punkt oben aus "$endung" entfernen da du den ja schon im Pattern geschrieben hast.
    Auf der anderen Seite müsstest du noch sicherstellen das ".abc" wirklich am Ende steht.
    So wie das Pattern jetzt ist würde z.B. auch eine Datei gefunden die "Test.abc.txt" heißt (ebenso wie .abc@-Dateien die entsel beschrieben hat).
    Mit StringRegExp kann man übrigens nicht nur Strings zerlegen sondern kann auch einfach nur auf ein Pattern testen.
    Daher könnte man die Schleife z.b. folgendermaßen zusammenfassen:

    [autoit]

    For $i = 1 To $aFiles[0]
    If StringRegExp($aFiles[$i], "\." & $endung & "$") Then MsgBox(0,"",$aFiles[$i])
    Next

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (22. Januar 2012 um 17:58)

  • Ich war immer der Meinung, um zB. abc@ zu finden, müßte der Suchstring zumindest "*.abc?" oder "*.abc*" heißen ...
    muss man halt die Ext. überprüfen ...

    Die While-Schleife hat bei mir aber funktioniert ?( - ich hätte angenommen "FileFindNextFile" gibt nach dem letzten Filenamen "?nix/nothing/nil?" zurück...

    Danke für Eure Hilfe und den Code

    SG, entsel

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • FileFindNextFile gibt nach dem letzten Fund einen Nullstring zurück.
    Selbst wenn es etwas spezielles wie NIL zurückgeben würde müsstest du aber auch noch darauf testen um die Schleife abzubrechen - machst du in deinem Code ja aber nicht.

  • Zitat

    ...machst du in deinem Code ja aber nicht.

    Vielleicht steh ich jetzt auf der Leitung ... vielleicht denke ich aber auch zu LISP-lastig ...
    Wenn nach der letzten Datei "$file" am Ende der While-Schleife durch FileFindNextFile auf NIL gesetzt würde, wäre das doch die Abbruchbedingung (für "While $file") ???
    Oder ist das in AutoIt anders - (mal abgesehen davon, wenn FileFindNextFile einen Leerstring liefert, der wiederum WAHR ist)?

    Ich hoffe, ich nerve nicht mit solchen Fragen, aber es interessiert mich halt.

    SG, entsel

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Oder ist das in AutoIt anders - (mal abgesehen davon, wenn FileFindNextFile einen Leerstring liefert, der wiederum WAHR ist)?


    AutoIt setzt einen Leerstring = False. Der Code ist mit @error aber schöner ;)

  • Ich hoffe, ich nerve nicht mit solchen Fragen, aber es interessiert mich halt.


    Überhaupt nicht - besonders nicht wenn du Recht hast ;)

    Entschuldige - ich habe zu flüchtig geschaut.
    $file wird zu einem Nullstring.
    While verlangt jedoch einen booleschen Wert.
    Wird der Nullstring also implizit im "While" in einen boolschen Wert gewandelt wird er zu "False" - die Schleife wird verlassen.
    Musst aber dennoch aufpassen das die Schleife dennoch komplett bis zum Ende - auch mit dem Nullstring als Wert ausgeführt wird.

  • Danke, alles klar

    SG, entsel

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.