Xcode NSFileManager';在桌面上运行.app时,s currentDirectoryPath返回根目录

Xcode NSFileManager';在桌面上运行.app时,s currentDirectoryPath返回根目录,xcode,macos,cocoa,executable,Xcode,Macos,Cocoa,Executable,我正在开发一个基本的web服务,并且正在登录屏幕上工作。当用户按下“登录”按钮时,我希望它激活一个运行二进制文件的NSTask,该二进制文件与应用程序捆绑在一起(使用给定的凭证执行登录)。现在,我获取工作目录,并将二进制文件的相对位置附加到工作目录以运行它。当我将二进制文件放在计算机的静态位置时,二进制文件运行良好,但我更愿意将二进制文件捆绑到应用程序的资源中(除非这是一个坏主意) 我的代码要点是可用的 在XCode项目目录中放置二进制文件的最佳位置是哪里,这样我就可以将其捆绑到文件夹“X.ap

我正在开发一个基本的web服务,并且正在登录屏幕上工作。当用户按下“登录”按钮时,我希望它激活一个运行二进制文件的
NSTask
,该二进制文件与应用程序捆绑在一起(使用给定的凭证执行登录)。现在,我获取工作目录,并将二进制文件的相对位置附加到工作目录以运行它。当我将二进制文件放在计算机的静态位置时,二进制文件运行良好,但我更愿意将二进制文件捆绑到应用程序的资源中(除非这是一个坏主意)

我的代码要点是可用的

在XCode项目目录中放置二进制文件的最佳位置是哪里,这样我就可以将其捆绑到文件夹“X.app/Contents”?

目前,我只是获取当前工作目录,然后将二进制文件的相对位置附加到此字符串。以下代码包含在
-(id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
方法的重写中:

NSFileManager *filemgr = [[NSFileManager alloc] init];    
self.pathString = [[NSString alloc] initWithString:filemgr.currentDirectoryPath];
我使用以下代码启动任务(包装在子类
NSViewController
中的方法中):

当应用程序在Debug文件夹中运行时,此选项有效。 但是,当我尝试将其移动到其他位置(即,将X.app复制到桌面)时,
filemgr
报告
currentDirectoryPath
是根目录(“/”)

这就引出了两个问题:

  • 为什么NSFileManager报告当前目录是“/”,而它应该是“/Users/stevenschmatz/Desktop/X.app”?
  • 有没有办法直接引用.app文件夹中的子目录,这样您就可以运行二进制文件,而不必考虑应用的位置,而根本找不到工作目录?

  • 提前谢谢你

    当前目录路径取决于启动环境,与应用程序的位置无关

    要获取应用程序包中的数据,请查看
    [NSBundle mainBundle]
    。与上述代码等效的代码为:

    NSString *launchPath=[NSBundle.mainBundle
        pathForResource:@"loginFromClient"
        ofType:nil
    ];
    

    正如Gerd所指出的,对于工作目录没有“应该”。你在这方面的期望是毫无根据的。工作目录实际上仅与命令行程序相关,供用户使用,以允许用户在将
    cd
    -ed添加到自己选择的目录后提供相对路径。另外,请查看NSString方法
    +(instancetype)stringWithContentsOfFile:(NSString*)路径编码:(NSStringEnc错误:(NSError**)error
    -(instancetype)initWithContentsOfFile:(NSString*)路径编码:(NSStringEncoding)enc error:(NSError**)error
    为您节省了大量的代码。非常感谢你们,我会检查一下:)
    NSString *launchPath=[NSBundle.mainBundle
        pathForResource:@"loginFromClient"
        ofType:nil
    ];