Функция StdioClose

         Описание функции


StdioClose

Закрывает все ресурсы, связанные с процессом ранее запущенным с STDIO перенаправлением.

StdioClose ( process_id )

Параметры

process_id Идентификатор дочернего процесса (PID), возвращённый предыдущим вызовом функции Run.

Возвращаемое значение

Успех:Возвращает значение неравное 0.
Ошибка:Возвращает 0, если процесс не имел STDIO перенаправление или был уже закрыт.

Примечания

Эта функция закрывает все дескрипторы и освобождает все ресурсы, связанные с STDIO. Это сделает невозможным более читать STDIO данные из процесса. Любые незавершённые данные будут потеряны.

См. также

StdoutRead, StderrRead, StdinWrite, Run, RunAs

Пример

#include <Array.au3> ; для _ArrayDisplay.
#include <Constants.au3>

; Рекурсивно выдавать список файлов каталога.
Example()

Func Example()
    Local $sFilePath = @ScriptDir ; Поиск в текущем каталоге со скриптами.
    Local $sFilter = "*.*" ; Поиск всех файлов в текущем каталоге. Правильный формат маски поиска ищите по слову 'Wildcards' в текущей справке.
    Local $sOutput = "" ; Переменная для хранения вывода StdoutRead.

    ; Если указанный путь не является каталогом, то выход из функции.
    If Not StringInStr(FileGetAttrib($sFilePath), "D") Then
        Return SetError(1, 0, 0)
    EndIf

    ; Удаляет завершающие слеши и добавляет один обратный слеш в конце.
    $sFilePath = StringRegExpReplace($sFilePath, "[\\/]+\z", "") & "\"

    #cs
        Параметры ком-строки для DIR:
        /B - вывод только имен.
        /A-D - поиск всех файлов, без папок.
        /S - поиск в подкаталогах.
    #ce
    Local $iPID = Run(@ComSpec & ' /C DIR "' & $sFilePath & $sFilter & '" /B /A-D /S', $sFilePath, @SW_HIDE, $STDOUT_CHILD)

    ; Закрывает поток Stdio используя PID возвращённый функцией Run. Это вызывает диалоговое окно из-за невозможности читать поток stdout.
    StdioClose($iPID) ; закомментируйте эту строку, чтобы увидеть результаты

    While 1
        $sOutput &= StdoutRead($iPID) ; Читает Stdout поток используя PID возвращённый функцией Run.
        If @error Then ; Выход из цикла, если процесс завершён или StdoutRead возвращает ошибку.
            ExitLoop
        EndIf
    WEnd

    ; Используется StringSplit для разделения результатов вывода StdoutRead в массив. Удаляются все символы @CR, а @LF используется как разделитель.
    Local $aArray = StringSplit(StringTrimRight(StringStripCR($sOutput), StringLen(@LF)), @LF)
    If @error Then
        MsgBox(4096, "", "Произошла ошибка при попытке найти все файлы в текущем каталоге скриптов.")
    Else
        ; Вывод результатов.
        _ArrayDisplay($aArray)
    EndIf
EndFunc