NSTask:确实存在启动进程的路径

时间:2011-08-13 10:54:16

标签: cocoa process filepath nstask

此代码用于获取进程的标准输出

    NSTask       * task;
    NSPipe       * pipe;
    NSFileHandle * fileHandle;

    task       = [ [ NSTask alloc ] init ];
    pipe       = [ NSPipe pipe ];
    fileHandle = [ pipe fileHandleForReading ];

    [ task setLaunchPath: @"/usr/bin/lspci" ];
    [ task setArguments:[NSArray arrayWithObject:@"-nn"]];
    [ task setStandardOutput: pipe ];
    [ task setStandardError: pipe ];
    [ task launch ];
    [ task waitUntilExit]; 
    [ task release];

    NSData *outputData = [[pipe fileHandleForReading] readDataToEndOfFile];

    NSString *outputString = [[[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding] autorelease];

由于/usr/bin/lspci在某些系统上不存在,因此会发生此致命错误

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'启动路径无法访问'

如何事先检查lspci是否存在,如果没有,则向用户显示错误消息?

2 个答案:

答案 0 :(得分:5)

检查文件是否存在且可执行:

BOOL exists = [[NSFileManager defaultManager] isExecutableFileAtPath:[task launchPath]];

缺少文件并不是您获得例外的唯一原因。您应始终使用@try - @catch阻止。

答案 1 :(得分:1)

BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/lspci"];
if (!exists) {
   // handle error...
}