FileClose

  • Hallo zusammen,

    Ich habe folgendes Problem mit dem Lesen von Dateien
    das Skript liest alle PDF Dateien nacheinander.
    Die Datei soll angezeigt werden und anschließend wieder geschlossen werden.

    Das geht leider nicht, da für jede Datei ein neues Fenster geöffnet wird
    ich habe schon mit FileOpen und FileClose probiert, leider ohne Erfolg.

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <array.au3>

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

    Local $sPath, $aFiles, $sText
    $sPath = FileSelectFolder("Bitte Ordner auswählen","",Default,@DocumentsCommonDir)
    If @error Then Exit

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

    $aFiles = _FileListToArray($sPath,"*.pdf",1) ; Dateien in ein Array lesen
    If @error Then Exit MsgBox(16,"Error","No files found")
    ;_ArrayDisplay($aFiles, "alle Dateien")
    For $i = 1 To UBound($aFiles)-1
    ;$handle = FileOpen($aFiles, 0)
    ;ShellExecute(@ScriptDir & "\"&$aFiles[$i])
    ShellExecute($sPath & "\"&$aFiles[$i])
    MSGBox(4096,$aFiles,$aFiles[$i])
    ;FileClose($aFiles[$i])

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

    Next

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

    Liebe Grüße
    Ilse ;)

  • ich gehe mal davon aus das der auskommentierte bereich immer auskommentiert ist?
    du schließt die pdf ja gar nicht?

    1. willst du darauf warten das es per hand geschlossen wird dann arbeite in der Schleife mit WinWaitClose
    2. möchtest du das automatisiert machen arbeite evtl. mit sleep()
    3. schau dir allgemein mal die Win Funktionen an

    ich bin mir nicht sicher... aber fileopen usw. öffnet keine programme sondern nur die dokumente im hintergrund und bereitet sie zum auslesen vor?
    shellexecute führt richtig die Dienstprogramme aus
    möchtest du das Dienstprogramm abschießen dann processclose()

  • Hallo,

    das mit WinClose ist mir soweit klar.
    ABER

    Wenn die pdf mit Acrobat geöffnet wird, oder einem anderen pdf Programm ???
    dann kann ich doch mit Winclose nicht arbeiten.

    Es muß doch zuerst das ? Fenster ermittelt werden.

    Und das ist das Problem. Wie kann man das machen?

    Liebe Grüße
    Ilse ;)

    • Offizieller Beitrag

    Es muß doch zuerst das ? Fenster ermittelt werden.

    [autoit]

    Opt("WinTitleMatchMode", 2)

    [/autoit]

    Wenn ich das jetzt gerade richtig im Kopf habe ist Parameter 2 = Erkennung von Teilen des Fenster-Titels
    Dein Fenstertitel ist z.B. "Acrobat Reader - DATEINAME", somit reicht es, wenn du nach "DATEINAME" das Fenster selektierst.

  • Die Win* Funktionen beziehen sich auf beliebige Fenster. Die Auswahl erfolgt über den übergebenen Fenstertitel.

    Zum Originalpost:
    Shell Execute führt das mit .PDF assoziierte Programm asynchron aus. D.h. die Ausführung des scripts läuft parallel.

    Die "Win"-Fkt auf die tobitron bereits hinwies sind hier die Lösung.

    Du muß gewisse Annahmen bzgl. des Fenstertitels treffen. Acrobat z.B. nennt gerne den Dateinamen (ohne pfad) zu Beginn des Fenstertitels. Andere Viewer (Foxit, Ghostview etc.) können das evtl. anders handhaben.

    Nach der Ausführung von ShellExecute solltest Du also zunächst auf das Erscheinen des Fensters mit dem entsprechenden Titel warten.
    Z.B.:

    Code
    Local $hndlWin = WinWait($aFiles[$i],30)


    (Beachte dabei ggf. den "WinTitleMatchMode")
    Dann prüfst Du die Rückgabe auf Erfolg und wartest bei erfolgreich geöffnetem Fenster mit WinWaitClose auf das schließen. Vor dem erneuten ausführen mit ShellExecute würde ich aber noch eine Pause mit Sleep einbauen die der PDF-Viewer Anwendung ausreichend Zeit gibt, sich zu beenden.

    Alternativ kannst Du mit Sleep eine gewisse Zeit warten und mit WinClose das Fenster vom Script aus schließen.

    FileOpen und FileClose macht da keinen Sinn. Das würde nur dann Sinn ergeben, wenn Du selbst etwas aus den PDF-Dateien herauslesen wolltest (was überhaupt nicht trivial ist).

  • Hallo,

    Ich muss mich leider wieder melden.
    Irgendwie arbeitet die Loop-Funktion nicht korrekt.

    die erste Datei wird angezeigt, das Fenster wird ermittelt
    und auch korrekt geschlossen.
    Die nächste Datei sollte dann starten.
    Das geht aber nicht.

    Hier nochmal der abgeänderte Code.

    [autoit]


    #include <File.au3>
    #include <array.au3>

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

    Opt("WinTitleMatchMode", 2)
    Local $sPath, $aFiles, $sText
    $sPath = FileSelectFolder("Bitte Ordner auswählen","",Default,@DocumentsCommonDir)
    If @error Then Exit

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

    $aFiles = _FileListToArray($sPath,"*.pdf",1) ; Dateien in ein Array lesen
    If @error Then Exit MsgBox(16,"Error","No files found")
    ;_ArrayDisplay($aFiles, "alle Dateien")
    For $i = 1 To UBound($aFiles)-1

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

    ShellExecute($sPath & "\"&$aFiles[$i]);Programm startet

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

    Local $hndlWin = WinWait($aFiles[$i],30)
    MSGBox(4096,$hndlWin,$aFiles[$i])
    Sleep(3000)
    WinClose($hndlWin)
    Next

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


    Grüße
    Ilse ;)