在Cocoa中:如何设置对一个文件夹的读写权限?

4
我正在调整一张图片的尺寸,然后将新文件保存到原始图像文件所在的相同目录中。
我只能设置对“images”目录的权限。如果我的应用程序需要选择在该目录内的图像,则可以按预期工作。如果我选择在另一个目录中的图像(例如用户创建的目录文件夹),则新图像不会出现。
我在App Sandbox中只看到“用户选择的文件”目录、“图片”目录、“下载”目录、“图片集”目录、“音乐”目录和“电影”目录。
是否有办法以程序方式授予此权限?

如何使用NSOpenPanel请求访问权限?你能帮忙吗? - Manthan
1个回答

12

你碰到了沙盒模型长期存在的问题,即支持将输入文档转换为位于同一位置的输出文档的应用程序。

苹果通过应用程序Info.plist中文档类型的NSIsRelatedItemType条目解决了该问题的子集。如果多个文档类型条目中存在此标志并且设置为YES,则在给定访问某一类型文件的权限时,您的应用程序有权创建任何其他类型的文件。

例如,TextEdit为.txt.rtf.rtfd文件类型设置了此标志,因此一旦被授予任意这些类型的文件的访问权限,它就可以创建同名但是其他类型的文件而无需进一步获得用户权限。这使得命令如“转换为纯文本”成为可能。

从您的问题中看,您似乎没有这样做,而是将“image.png”转换为“image-resized.png”,即更改名称而不是类型。这需要应用程序从用户处获得进一步的权限,否则不支持。

最好的解决方法是请求用户对其希望调整大小的文件所在文件夹进行权限请求。获得该权限后,应用程序可以在该文件夹内执行任意数量的文件创建操作,就像您观察到的授予访问某些特殊文件夹的权限一样。

一个可行的流程如下:

1 - 当需要创建输出文件时,请检查应用程序是否有访问包含文件夹的权限-您可以使用access函数进行此操作(请参见OS X手册第2节,例如在终端中输入“man access”或在Xcode的文档中搜索access)。

2 - 如果没有访问权限,则向用户请求包含文件夹的权限-通过适当的NSOpenPanel提示他们选择带有说明的包含文件夹。

4 - 一旦您被授予访问权限,请将其保存 - 在应用程序“应用支持”目录中的文件中存储一个安全范围的书签,指向该文件夹。你可以在建立缓存时“修剪”它 - 对于文件系统树中的任何文件夹的书签都消除了对其下面的任何文件夹的书签的需要。这样做可以实现以下效果:

2 - 如果您没有访问权限,请检查您已保存的书签缓存,并查看是否有一个针对该文件夹的书签,如果有,请激活它。请注意,此检查是针对包含文件夹或文件系统树中任何父文件夹的书签。

使用这个过程,随着时间的推移,您会积累到用户使用的文件夹的访问权。您应该为用户提供清理缓存的方法。

情况并不像听起来那么糟糕!希望对您有帮助。


非常感谢你,伙计...你的回答非常详尽和完整...但对我来说太麻烦了...所以我采用了另一种解决方案...无论如何,还是非常感谢你的帮助性回答...祝好... Massy - Blue
1
我需要使用NSOpenPanel请求权限,因为我要写的文件是styles.css.gz,而原始文件是styles.css。我编写了这个类,将所有逻辑封装起来,以便在必要时请求权限并保持该权限。https://github.com/leighmcculloch/AppSandboxFileAccess - Leigh McCulloch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接