Чтение необязательного конвейерного ввода в командной строке - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю над приложением командной строки, написанным на Swift, и у меня возникают проблемы с чтением ввода.Я хочу собрать список файлов как в качестве аргументов для приложения, так и в виде данных из таких утилит, как find.Например:

wrench -f aFile.txt
find . -name *.txt | wrench

Аргументы просты, но у меня проблемы с чтением данных из канала.Если я это сделаю:

let standardInput = FileHandle.standardInput
let data = standardInput.readDataToEndOfFile()
print("Files: \(String(data: data, encoding: .utf8)!)")

Он работает с данными по каналам, но зависает, когда не работает.

Если I:

while let line = readLine() {
    print("\(line)")
}

Он снова зависает, когда не обвязан.Другой вариант:

standardInput.readabilityHandler = { fileHandle in
    print("Data \(String(data: fileHandle.availableData, encoding: .utf8)!)")
}

Похоже, что работает, но когда есть много файлов, программа заканчивается, прежде чем все входные данные были прочитаны.

Так что мне также нужно найти способчтобы сохранить программу до конца.файлы были прочитаны и обработаны.

Я много занимался поиском, но пока не смог найти никого, кто бы это сделал (что странно, я бы подумал, что этого достаточно).

Кто-нибудь знает, как решить эти проблемы?

...