在 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 中查看的文件夹与“当前目录”不同。简而言之,“当前目录”与应用程序所在的位置无关。
在我的 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 中查看的文件夹与“当前目录”不同。简而言之,“当前目录”与应用程序所在的位置无关。