【问题标题】:NSTask: does launch path of process existNSTask:进程的启动路径是否存在
【发布时间】:2011-08-13 10:54:15
【问题描述】:

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

    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 是否存在,如果不存在则向用户显示错误消息?

【问题讨论】:

    标签: cocoa process filepath nstask


    【解决方案1】:

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

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

    缺少文件并不是您获得异常的唯一原因。您应该始终使用@try-@catch 块。

    【讨论】:

    • 这个错误可能是什么原因?(假设文件存在并且setlaunchpath成功)
    • @Mike.R 一个原因是现代系统具有先进的文件访问控制,因此除了没有设置 Unix 可执行/可读位之外,可能会发生拒绝访问错误。此外,文件系统天生就容易出现竞争:网络连接可能会中断,设备可能会出现故障或被物理弹出,文件可能在您上次检查其可用性后已被删除。
    • hamstegene 我尝试通过用我自己的替换 Safari 可执行文件来启动 Safari。因此,在我自己的可执行文件中,我将启动正宗的 Safari 应用程序(用于 IOS 模拟器),我使用 try catch 块检查所有路径,我得到此错误的地方是 [task launch]。你知道如何调查它吗?
    • @Mike.R 您需要为此打开新问题。评论是为了改进答案,而不是一般性讨论。
    • 有点同意你的看法,谢谢。
    【解决方案2】:
    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/lspci"];
    if (!exists) {
       // handle error...
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      相关资源
      最近更新 更多