Разрешение доступа к корневому каталогу приложение какао для запуска скриптов в 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(), если вы используете логику [завершение задачи] и отбрасываете возвращаемые строки. Даже если вам это не нужно, вывод может помочь при устранении ошибок.