macos - 让 macOS 沙盒应用程序写入由我的非沙盒应用程序创建的文件
问题描述
我有一个 macOS/Objective-C/Cocoa 应用程序。我们想要生成外部应用程序,比如 TextEdit,来编辑这个应用程序创建的文件。我通过将这些文件复制到我的 ~/Documents 目录中来创建这些文件(最终我想把它放在其他地方,但我正在尝试简化):
NSFileManager *defaultManager = [NSFileManager defaultManager];
[defaultManager copyItemAtPath:srcPath toPath:destPath error:&err];
NSDate *sourceModified = [self lastModificationOfFile:srcPath];
NSDictionary * attr = @{ NSFileModificationDate : sourceModified,
NSFileImmutable : [NSNumber numberWithBool:NO],
NSFilePosixPermissions : [NSNumber numberWithUnsignedLong:0666],
};
[defaultManager setAttributes:attr ofItemAtPath:destPath error:nil];
当我在 TextEdit 中打开此文件时,窗口标题显示“filename.txt - 已锁定”。编辑文档会给我“您确定要修改文档吗?” 对话。我选择“覆盖”,但随后尝试保存给我“无法保存文档“filename.txt”。您没有权限。”
但是,这会将“filename.txt.sb-a69dcdc5-7V6D2g”(或类似名称)文件写入我的 Documents 目录。并且在同一目录中使用“echo blablabla > filename.txt”从 bash shell 创建的文件可以正常打开。
我已经尝试了这些属性的许多变体。我看不出工作的文件和使用“ls -la@ filename.txt”或“xattr”显示“... - Locked”的文件之间有任何区别,甚至在同一目录中并排显示。
显然,我创建的文件存在一些沙盒问题,但我所有的搜索结果都与这个问题的另一面有关。
解决方案
啊。我发现了这个:为什么 TextEdit 将 HTML 文件打开为已锁定。显然,由于我的 .txt 文件的内容,TextEdit 将其解释为 HTML 文档,并据此区别对待。用看起来不像 HTML 的东西替换了文件的内容,我现在可以编辑文档了。
推荐阅读
- r - 如何使用复选框作为选择性类别
- mysql - 无法访问在 vpc 的子网 cidr 范围为 100.0.0.0/26 的私有子网中创建的 mysql
- swift - CreateML 对“testing.csv”的 URL 的预期目录是什么意思?
- java - 如何从 Firestore DB 文档中的地图字段的子字段中检索值?
- python - 带有for循环和if-else语句的python列表
- java - 如何使用另一个java文件中的对话框?
- html - 我怎样才能得到这个代码来显示 fontawesome 图标?
- java - 覆盖java库中的属性
- http - Go 中的 Lambda 二进制有效负载编码
- sql - 日期地点条款