代码之家  ›  专栏  ›  技术社区  ›  TenG

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

  •  1
  • TenG  · 技术社区  · 7 年前

    我在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 回复  |  直到 7 年前
        1
  •  2
  •   Rob Md Fahim Faez Abir    7 年前

    现代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);
    

    返回:

    /用户/{username}/Library/Containers/{com.domain.app}/Data/Library

    然后可以将其传递给C函数。


    顺便说一句,苹果明确建议我们不要在 Preferences 子文件夹。他们 warn us :

    此目录包含特定于应用程序的首选项文件。您不应该自己在此目录中创建文件。相反,请使用 NSUserDefaults 类别或 CFPreferences API来获取和设置应用程序的首选项值。