macOS app无法打开存在的文件

时间:2017-12-20 18:18:25

标签: c macos fopen

我在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有一个工作目录,但是会影响上面的绝对路径吗?

1 个答案:

答案 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来获取和设置应​​用的偏好设置值。