NSTask: существует ли путь запуска процесса - PullRequest
2 голосов
/ 13 августа 2011

Этот код используется для получения стандартного вывода процесса

    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 ]

5 голосов
/ 13 августа 2011

Чтобы проверить, существует ли файл и является ли он исполняемым:

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

Отсутствующий файл - не единственная причина, по которой вы можете получить исключение.Вы всегда должны использовать @try - @catch блок.

1 голос
/ 13 августа 2011
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/lspci"];
if (!exists) {
   // handle error...
}
...