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 существует, и если его нет, то выводить пользователю сообщение об ошибке?


person yolo    schedule 13.08.2011    source источник


Ответы (1)


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

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

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

person hamstergene    schedule 13.08.2011
comment
В чем может быть причина этой ошибки? (при условии, что файл существует и setlaunchpath выполнен успешно) - person Mike.R; 23.05.2013
comment
@Mike.R Одна из причин заключается в том, что современная система имеет расширенный контроль доступа к файлам, поэтому ошибка отказа в доступе может произойти по другим причинам, кроме отсутствия установленных исполняемых / читаемых битов Unix. Кроме того, файловые системы по своей природе склонны к гонкам: сетевое соединение может прерваться, устройство может выйти из строя или быть физически извлечено, файл мог быть просто удален с тех пор, как вы в последний раз проверяли его доступность. - person hamstergene; 23.05.2013
comment
hamstogene Я пытаюсь запустить Safari, заменив исполняемый файл Safari своим собственным. Итак, в моем собственном исполняемом файле я запускаю подлинное приложение Safari (для симулятора IOS), я проверяю весь путь с помощью блока try catch, и место, где я получаю эту ошибку, — [запуск задачи]. У вас есть идеи, как это исследовать? - person Mike.R; 23.05.2013
comment
@Mike.R Для этого вам нужно открыть новый вопрос. Комментарии предназначены для улучшения ответа, а не для общего обсуждения. - person hamstergene; 23.05.2013
comment
Вроде согласен с вами, спасибо. - person Mike.R; 23.05.2013