我在一个Xcode应用程序(macOS)中有一个C模块来打开一个文件。
以下是代码:
char fname1 [1028] = "/Library/Preferences/tbupdd.ini";
FILE * fp;
fp = fopen(fname1, "r");
if (fp == NULL)
{
perror("error opening updd.ini");
printf("File %s not found, use another method for getting version\n", fname1);
exit(1);
}
该文件存在,我可以在终端读取它。但是在Xcode中运行这个应用程序
error opening updd.ini: Operation not permitted
该文件具有以下权限:
$ ls -l /Library/Preferences/tbupdd.ini
-rw-r--r-- 1 root wheel 25584 20 Dec 15:05 /Library/Preferences/tbupdd.ini
我知道Xcode有一个工作目录,但这会影响上面的绝对路径吗?
发布于 2017-12-20 18:54:19
现代macOS应用程序使用沙箱,只允许对沙箱中的文件进行更新。见文件系统编程指南:库目录存储应用程序专用文件。也见关于。
我不建议使用这样的硬编码路径。我建议从NSFileManager
中获取库文件夹
NSURL *fileURL = [[NSFileManager defaultManager] URLForDirectory:NSLibraryDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:true error:&error];
NSAssert(!error, @"Unable to get library directory: %@", [error localizedDescription]);
NSLog(@"%s", fileURL.path.UTF8String);
返回:
/Users/{username}/Library/Containers/{com.domain.app}/Data/Library
然后,您可以将它传递给C函数。
顺便说一句,苹果明确建议我们不要在Preferences
子文件夹中创建文件。他们警告我们
此目录包含特定于应用程序的首选项文件。您不应该自己在这个目录中创建文件。相反,使用
NSUserDefaults
类或CFPreferences
API来获取和设置应用程序的首选项值。
https://stackoverflow.com/questions/47912123
复制相似问题