首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >macOS应用程序无法打开存在的文件

macOS应用程序无法打开存在的文件
EN

Stack Overflow用户
提问于 2017-12-20 18:18:25
回答 1查看 1.6K关注 0票数 1

我在一个Xcode应用程序(macOS)中有一个C模块来打开一个文件。

以下是代码:

代码语言:javascript
运行
复制
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中运行这个应用程序

代码语言:javascript
运行
复制
error opening updd.ini: Operation not permitted

该文件具有以下权限:

代码语言:javascript
运行
复制
$ ls -l /Library/Preferences/tbupdd.ini
-rw-r--r--  1 root  wheel  25584 20 Dec 15:05 /Library/Preferences/tbupdd.ini

我知道Xcode有一个工作目录,但这会影响上面的绝对路径吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-20 18:54:19

现代macOS应用程序使用沙箱,只允许对沙箱中的文件进行更新。见文件系统编程指南:库目录存储应用程序专用文件。也见关于

我不建议使用这样的硬编码路径。我建议从NSFileManager中获取库文件夹

代码语言:javascript
运行
复制
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来获取和设置应用程序的首选项值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47912123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档