写入文件 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文件夹?