写入文件 Xcode MacOS

Write to a file Xcode MacOS

我无法运行这段将 pid 写入文件的代码。

NSString *text = [NSString stringWithFormat:@"%d\n", getpid()];
NSError *error = nil;

if (![text writeToFile:@"/tmp/Frontend.pid" atomically:YES encoding:NSUTF8StringEncoding error:&error]) {
    NSLog(@"Cannot write PID file %@: %@", @"/tmp/Frontend.pid", error);
    return NO;
}

这是我得到的错误。

2017-11-13 20:19:18.742171+0530 TestThread[7648:273326] 无法写入 PID 文件 /tmp/Frontend.pid: Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “Frontend.pid” in the folder “tmp”." UserInfo ={NSFilePath=/tmp/Frontend.pid, NSUnderlyingError=0x6040000432a0 {错误域=NSPOSIXErrorDomain 代码=1 "Operation not permitted"}}

我已将目录的权限更改为 777,但它仍然没有足够的权限。请帮忙

/tmp 在 macOS 上是 link 到 /private/tmp 的符号。您是否更改了 link 或目标的权限?

例如,在我的机器上我看到以下内容:

$ ls -ld /tmp
lrwxr-xr-x@ 1 root  wheel  11 Oct 14 14:55 /tmp -> private/tmp
$ ls -ld /private/tmp
drwxrwxrwt  16 root  wheel  512 Nov 13 06:43 /private/tmp

这意味着只有 root 可以修改 link,但任何人都应该能够写入该目录。事实上,我可以在该目录中写入文件。由于 t 粘滞位,只有在 /tmp(或 root 或 wheel)中拥有文件本身的用户才能 delete/rename 该文件。

我会检查您在 /tmp/Frontend.pid 处是否还没有以无法覆盖的方式设置权限的文件(writeToFile:atomically:encoding:error 将覆盖现有文件) .

好吧,我终于修好了。这是 xcode 中一个新项目的默认配置,它破坏了整个文件 io 的东西。我关闭了权利文件中的这 2 个旋钮,一切顺利。

补充一下。在 XCode10 我按照@alDiablo 的建议更改了权利。

转到您的目标,并在功能上启用用户选择的文件作为 Read/Write。

谢谢!

遇到同样的错误 (macOS 10.15.7 Catalina),我的沙箱似乎没问题(用户选择的文件 Read/Write),仍然是错误。由于从 NSData 对象直接写入并不是真正的“用户选择”,我决定在两者之间使用 NSSavePanel。效果很好。用它来将 NSImage 保存为 tiff:

NSSavePanel *savePanel = [NSSavePanel savePanel];
savePanel.title = @"Save…”;
savePanel.message = @"Saves the …”;
savePanel.allowedFileTypes = @[ @"tiff" ];
savePanel.nameFieldStringValue = @“image”;
NSModalResponse result = [savePanel runModal];
if (result == NSModalResponseOK) {            
    NSError *error;
    NSData *tiffData = [anImage TIFFRepresentation];
    BOOL success = [tiffData writeToURL:savePanel.URL options:NSDataWritingAtomic error:&error];
    if (!success) NSLog( @"%@", error);
}