写入文件 Xcode MacOS

Posted

技术标签:

【中文标题】写入文件 Xcode MacOS【英文标题】:Write to a file Xcode MacOS 【发布时间】:2018-04-26 07:22:02 【问题描述】:

我无法运行这段将 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:错误 Domain=NSCocoaErrorDomain Code=513 “您没有保存文件的权限文件夹“tmp”中的“Frontend.pid”。” UserInfo=NSFilePath=/tmp/Frontend.pid, NSUnderlyingError=0x6040000432a0 Error Domain=NSPOSIXErrorDomain Code=1 "Operation not allowed"

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

【问题讨论】:

【参考方案1】:

/tmp 是 macOS 上 /private/tmp 的符号链接。您是否更改了链接或目的地的权限?

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

$ 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 可以修改 链接,但任何人都应该能够写入目录。事实上,我可以在那个目录中写文件就好了。由于t 粘性位,只有在/tmp(或root 或wheel)中拥有文件本身的用户才能删除/重命名文件。

我会检查您是否在 /tmp/Frontend.pid 中没有一个文件,其权限设置为不能被覆盖(writeToFile:atomically:encoding:error 将覆盖现有文件)。

【讨论】:

我查过了。没有同名的文件。你能运行代码sn-p吗? 是的,我运行了您的示例——修改为将 NSString *path 设置为路径(因为它在您的示例中未定义),并将 LoggerWarn 设置为 NSLog。它对我有用。 您还有什么建议吗?我仍然面临同样的问题。您是否更改了项目中的某些设置?【参考方案2】:

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

【讨论】:

【参考方案3】:

只是为了补充。在 XCode10 上,我按照@alDiablo 的建议更改了权利。

转到您的目标,然后在功能上,将用户选择的文件启用为读/写。

谢谢!

【讨论】:

【参考方案4】:

遇到同样的错误(macOS 10.15.7 Catalina),我的沙箱似乎没问题(用户选择的文件读/写),仍然是错误。由于从 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);

【讨论】:

以上是关于写入文件 Xcode MacOS的主要内容,如果未能解决你的问题,请参考以下文章

在macOS上写入Node.js中的〜/ Documents文件夹?

xCode 游乐场和将文件写入文档

写入 XCode 项目目录中的文件

如何在 Xcode 项目中将字典数组写入 .txt 文件

Swift 5 (Xcode 11 Betas 5 & 6) - 如何写入 JSON 文件?

xCode ios 如何将可变数组写入桌面上的文件?