разрешение доступа к корневому каталогу приложение какао для запуска скриптов в Mac OS 10.7 - PullRequest
0 голосов
/ 27 февраля 2012

Команда

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

system("mkdir tempDir");

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

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

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

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

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

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

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

0 голосов
/ 28 февраля 2012

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

...