【问题标题】:root directory permission issue cocoa app to run scripts in mac os 10.7根目录权限问题 cocoa app 在 mac os 10.7 中运行脚本
【发布时间】:2025-12-24 18:35:12
【问题描述】:

团队,

我是 MAC OS Cocoa 应用程序开发的新手。 我正在开发一个可可应用程序,一种实用程序应用程序。 在我的应用程序中,我正在执行一些命令,例如“mkdir”、“cp”、“rm” 我使用系统命令从目标 c 执行上述命令。如下图所示。

system("mkdir tempDir");

从 xcode 运行此应用程序时,它运行良好并创建了所有文件夹。 当我通过双击 Mac OS X 10.7 中的 .app 文件运行时,该目录未创建并以错误代码 256 退出。我注意到直接从 .app 文件启动应用程序时,它是从根目录运行的,即 macintosh 驱动器.

然后我改变了Macintosh的权限,允许所有人读写权限。我在“GetInfo”部分做了这个。通过这样做,应用程序可以在从 .app 运行时创建目录。

请帮助我从我的应用程序本身解决这个权限问题。

【问题讨论】:

    标签: cocoa osx-lion root


    【解决方案1】:

    如果权限没问题,那么听起来您可能没有获得正确的 shell 环境。许多简单命令(如 mkdir)都有 Cocoa 等效项,但如果您更喜欢命令行,我建议使用我非常幸运的 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() 命令一样操作。即使您不需要它,输出也有助于排除错误。

    【讨论】:

      【解决方案2】:

      我遇到了和你一样的问题,我想我不妨分享一下解决方案。您正在将数据写入错误的目录。见this page

      在 Mac 上,为您的应用程序存储持久性用户相关文件的正确位置是在当前用户的应用程序支持目录中与您的应用程序同名的目录中。

      我上面链接的页面向您展示了如何在应用程序支持中为您的数据创建一个目录并在您的代码中找到它。这样做解决了我所有的权限问题。

      【讨论】: