2011-01-11 1 views
4

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

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's setAttributes:ofItemAtPath:error: с атрибутом NSFilePosixPermissions. Я буду делать логику чтения и записи POSIX, если понадобится, но хотел бы посмотреть, есть ли более элегантный метод.

+0

Просто немного примечания: так как строковые литералы являются постоянными, нет необходимости использовать '+ [NSString stringWithString:]' в первой строке. –

+0

Да, это не в моем фактическом коде (только для того, чтобы сделать его очень понятным, что представляет скрипт), но я изменил его, чтобы быть более сенсационным. –

ответ

2

Что нелепо в отношении метода 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 */ 
+0

Согласен, это был словарь, который оставил плохой вкус во рту. Я дам POSIX-метод попробовать улучшить скорость и, возможно, переключиться на 'setAttributes: ofItemAtPath: error:', если код C сильно на меня надавливает. Спасибо, ребята, и спасибо за пример кода Джереми! –

4

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

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

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

+1

'-setAttributes: ofItemAtPath: error:' определенно правильный способ справиться с этим. –

Смежные вопросы