在 Mac 应用程序中获取应用程序目录路径的正确方法

Correct way to get Application directory path in Mac App

在我的 Mac OS 应用程序中,我尝试使用以下代码获取应用程序当前目录,以便在应用程序包路径中生成日志文件。

NSString *path = [[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:@"TSPlogfile.txt"];

当我 运行 来自 Xcode 的应用程序但发现 [[NSFileManager defaultManager] currentDirectoryPath] returns 只是 / 而 运行 宁 applicationxxx.app 来自取景器。

后来我用[[[NSBundle mainBundle].bundlePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"TSPlogfile.txt"];

解决了这个问题

在这两种情况下都可以正常工作(运行ning app from Xcode and from finder)

您能解释一下为什么 [[NSFileManager defaultManager] currentDirectoryPath] 在 运行 从 Finder 中使用应用程序时失败吗?

这是获取应用程序包所在目录的方法:

NSURL *appFolder = [[[NSBundle mainBundle] bundleURL] URLByDeletingLastPathComponent];

这为您提供了应用程序文件夹(/Applications 和 ~/Applications)的路径

NSArray *paths =[[NSFileManager defaultManager] URLsForDirectory:NSApplicationDirectory inDomains:NSLocalDomainMask];

您不应向捆绑包或应用程序所在的文件夹写入任何内容。如果您的应用是 sandboxed,您将无法。

改为使用“应用程序支持”文件夹:

NSError *error;
NSFileManager *manager = [NSFileManager defaultManager];
NSURL *applicationSupport = [manager URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:false error:&error];
NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
NSURL *folder = [applicationSupport URLByAppendingPathComponent:identifier];
[manager createDirectoryAtURL:folder withIntermediateDirectories:true attributes:nil error:&error];
NSURL *fileURL = [folder URLByAppendingPathComponent:@"TSPlogfile.txt"];

我在上面使用了 NSURL 实现,但如果使用路径,同样的概念也适用。

参见 File System Programming Guide: macOS Library Directory Details

你问:

Can you explain why the [[NSFileManager defaultManager] currentDirectoryPath] fails while running app from finder?

当应用程序 运行 时,您碰巧在 Finder 中查看的文件夹与“当前目录”不同。简而言之,“当前目录”与应用程序所在的位置无关。