首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFilehandle Swift

NSFilehandle Swift
EN

Stack Overflow用户
提问于 2014-11-15 07:25:51
回答 1查看 2.8K关注 0票数 2

我正试图将命令行返回的信息作为字符串输入到我的程序中。这是我的代码,我尝试了一些其他的变体,没有运气。

代码语言:javascript
复制
    let MyTask : NSTask = NSTask()
    MyTask.launchPath = "/usr/bin/cal"
    MyTask.arguments = ["04","2014"]
    MyTask.launch()
    MyTask.waitUntilExit()
    var TheHandle = MyTask.standardOutput as  NSFileHandle
    println(TheHandle)
    var Data = TheHandle.readDataToEndOfFile()
    var DataAsString = NSString(data: Data,encoding: NSUTF8StringEncoding)
    println(DataAsString)

输出量

代码语言:javascript
复制
     April 2014
Su Mo Tu We Th Fr Sa
1  2  3  4  5
6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

<_NSStdIOFileHandle: 0x6180000e4f80>
2014-11-14 23:22:40.014 Command Reader[6631:118648] *** -[_NSStdIOFileHandle     readDataOfLength:]: Bad file descriptor
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-15 07:45:00

任务的标准输出必须设置为进程可以写入的文件句柄。对于父进程和子进程之间的通信,通常使用管道完成。子进程写入管道的写入端,父进程从读取端读取:

代码语言:javascript
复制
let myTask  = NSTask()

myTask.launchPath = "/usr/bin/cal"
myTask.arguments = ["04","2014"]

let pipe = NSPipe()
myTask.standardOutput = pipe

myTask.launch()
myTask.waitUntilExit()

let theHandle = pipe.fileHandleForReading
let data = theHandle.readDataToEndOfFile()
if let dataAsString = NSString(data: data,encoding: NSUTF8StringEncoding) {
    println(dataAsString)
} else {
    println("could not convert output to string")
}

备注:

  • myTask.standardOutput设置为管道本身。这将导致进程写入pipe.fileHandleForWriting,并在完成时关闭该文件描述符。如果文件描述符未关闭,则父进程中的theHandle.readDataToEndOfFile()将无限期地等待。
  • 我使用了以小写字母开头的变量,这是Swift中的惯例.

如果要将进程输出写入文件,则可以创建文件,将其作为文件句柄打开,并将该句柄传递给myTask.standardOutput

代码语言:javascript
复制
let myTask  = NSTask()
myTask.launchPath = "/usr/bin/cal"
myTask.arguments = ["04","2014"]

let path = "/path/to/output.txt" // where the output should be written ...
if (!NSFileManager.defaultManager().createFileAtPath(path, contents: nil, attributes: nil)) {
    println("could not create file")
} else if let theHandle = NSFileHandle(forWritingAtPath: path) {
    myTask.standardOutput = theHandle

    myTask.launch()
    myTask.waitUntilExit()
    theHandle.closeFile()
} else {
    println("could not open file")
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26943635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档