Лучший способ сделать файл исполняемым в Objective-C - PullRequest
4 голосов
/ 11 января 2011

Мне нужно иметь возможность выполнить файл с помощью кода, который прекрасно работает, но чтобы убедиться в его успешности, я сначала должен установить исполняемый бит в файле.В настоящее время я запускаю chmod +x через NSTask, но это кажется неуклюжим:

NSString *script = @"/path/to/script.sh";
// At this point, we have already checked if script exists and has a shebang
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager isExecutableFileAtPath:script]) {
    NSArray *chmodArguments = [NSArray arrayWithObjects:@"+x", script, nil];
    NSTask *chmod = [NSTask launchedTaskWithLaunchPath:@"/bin/chmod" arguments:chmodArguments];
    [chmod waitUntilExit];
}

Есть предложения?Мне не повезло найти примеры кода, и, похоже, единственным другим вариантом является NSFileManager setAttributes:ofItemAtPath:error: с атрибутом NSFilePosixPermissions.Я сделаю POSIX-логику чтения и записи, если мне нужно, но я хотел посмотреть, есть ли более элегантный метод там.

Ответы [ 2 ]

4 голосов
/ 11 января 2011

Используйте -setAttributes:ofItemAtPath:error:. Что в этом не элегантного?

Другая возможность - использовать chmod(2), функцию POSIX.

Решение, которое вы перечислили в своем вопросе, дорогое - выполнение задачи эквивалентно созданию нового процесса в операционной системе, что определенно дороже, чем использование NSFileManager или chmod(2).

2 голосов
/ 11 января 2011

Что нехорошо в методе NSFileManager, так это необходимость создания словарной структуры, которая ужасно многословна.Подход POSIX будет:

#include <sys/types.h>
#include <sys/stat.h>

const char path[] = "hardcoded/path";

/* Get the current mode. */
struct stat buf;
int error = stat(path, &buf);
/* check and handle error */

/* Make the file user-executable. */
mode_t mode = buf.st_mode;
mode |= S_IXUSR;
error = chmod(path, mode);
/* check and handle error */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...