Разрешение доступа к корневому каталогу приложение какао для запуска скриптов в Mac OS 10.7

Команда,

Я новичок в разработке приложений для Mac OS Cocoa. Я разрабатываю приложение для какао, своего рода полезное приложение. В моем приложении я выполняю несколько команд, таких как "mkdir", "cp", "rm". Я выполняю вышеупомянутые команды из цели c, используя системные команды. Как показано на примере ниже.

system("mkdir tempDir");

При запуске этого приложения из xcode оно работает нормально и создал все папки. Когда я запускаю, дважды щелкнув по файлу.app в Mac OS X 10.7, каталог не создается и закрывается с кодом ошибки 256. Я заметил, что при запуске приложения непосредственно из файла.app оно запускается из корневого каталога, то есть с диска Macintosh.,

Затем я изменил разрешение Macintosh, разрешив чтение и запись для всех. Я сделал это в разделе "GetInfo". Это позволило приложению создавать каталоги при запуске из.app.

Пожалуйста, помогите мне решить эту проблему с разрешением из самого приложения.

2 ответа

У меня была та же проблема, что и у вас, и я подумал, что мог бы поделиться этим решением. Вы пишете данные в неправильный каталог. Смотрите эту страницу:

На Mac правильное расположение для хранения постоянных пользовательских файлов для вашего приложения находится в каталоге с тем же именем, что и ваше приложение в каталоге Application Support для текущего пользователя.

На странице, на которую я ссылался выше, показано, как создать каталог для ваших данных в Application Support и найти его в своем коде. Это решило все мои проблемы с разрешениями.

Если разрешения в порядке, это звучит так, как будто вы не получаете надлежащую среду оболочки. Для многих простых команд, таких как mkdir, есть эквиваленты Какао, но если вы предпочитаете командную строку, я бы предложил использовать объектную модель NSTask, с которой мне очень повезло. Вот моя собственная адаптация довольно распространенного шаблона для вас.

-(NSString *) runThisCmd:(NSString *) runString withArgs:(NSArray *)runArgs  {

//this method of calling NSTask is designed for small quick commands that return
//a small amount of data to the command line

NSTask *task = [NSTask new];
[task setLaunchPath:runString];
[task setArguments:runArgs];
[task setStandardOutput:[NSPipe pipe]];
[task setStandardInput: [NSPipe pipe]];
[task setStandardError: [task standardOutput]];
[task launch];

NSData *stdOuput = [[[task standardOutput] fileHandleForReading] readDataToEndOfFile];

[task waitUntilExit];  

if ([task terminationStatus] == 0) {

    //scriptSuccess = YES;
}
else {

    //scriptSuccess = NO;
}

NSString *outputString = [[NSString alloc] initWithData:stdOuput encoding:NSUTF8StringEncoding];
return outputString;

}

Назовите это так:

NSString *runCmd = [[NSString alloc] initWithString:@"/bin/bash"];
NSArray *runArgs = [[NSArray alloc] initWithObjects:@"-c",@"mkdir",@"/tmp/newdir",nil];

//update proper label
NSString *output;
output =  [self runThisCmd:runCmd withArgs:runArgs];

Примечание: вы можете адаптировать этот подход, чтобы он действовал так же, как команда system(), если вы используете логику [завершение задачи] и отбрасываете возвращаемые строки. Даже если вам это не нужно, вывод может помочь при устранении ошибок.

Другие вопросы по тегам