我在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有一个工作目录,但是会影响上面的绝对路径吗?
答案 0 :(得分:0)
现代macOS应用程序采用沙盒,只允许更新沙箱中的文件。见File System Programming Guide: The Library Directory Stores App-Specific Files。另请参阅About App Sandbox。
我不建议使用像这样的硬编码路径。我建议从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);
返回:
/用户/ {名} / Library /容器/ {com.domain.app} /数据/库
然后你可以将它传递给你的C函数。
顺便说一句,Apple明确建议我们不要在Preferences
子文件夹中创建文件。他们warn us:
此目录包含特定于应用程序的首选项文件。您不应自己在此目录中创建文件。相反,请使用
NSUserDefaults
类或CFPreferences
API来获取和设置应用的偏好设置值。