【问题标题】:In Cocoa: How to set permission to read/write to a folder?在 Cocoa 中:如何设置对文件夹的读/写权限?
【发布时间】:2013-11-08 23:07:07
【问题描述】:

我正在转换图像大小,然后将新文件保存到原始图像文件所在的同一目录中。

我只能设置“图像”目录的权限。如果我的应用程序需要选择该目录内的图像,它会按预期工作。如果我选择另一个目录中的图像(例如用户创建的目录文件夹),则不会出现新图像。 我在 App Sandbox 中看到只有“用户选择的文件”目录、“图像”目录、“下载”目录、“图片”目录、“音乐”目录和“电影”目录。

有没有办法以编程方式授予此权限?

【问题讨论】:

  • 如何使用 NSOpenPanel 请求访问权限???你能帮忙吗?

标签: cocoa sandbox file-permissions directory-permissions


【解决方案1】:

您对沙盒模型存在长期担忧;支持将输入文档转换为同一位置的输出文档的应用程序。

Apple 解决了应用程序 Info.plist 中文档类型的 NSIsRelatedItemType 条目的部分问题。如果此标志存在并且YES 在多个文档类型条目中,则当您的应用程序被授予对其中一种类型文件的访问权限时,您的应用程序将有权创建任何其他类型的文件。

例如,TextEdit 为.txt、.rtf 和.rtfd 文件类型设置了此标志,因此一旦获得对这些类型中任何一种文件的访问权限,它就可以创建一个同名但属于以下任何一种文件的文件其他类型无需进一步的用户许可。它启用诸如“转换为纯文本”之类的命令。

从您的问题看来,您没有这样做,而是说将“image.png”转换为“image-resized.png”,即更改 name 而不是 输入。如果应用程序没有从用户那里获得进一步的权限,则不支持此操作。

最好的解决方法是询问用户是否允许访问他们希望调整大小的文件所在的封闭文件夹。一旦应用程序拥有该权限,它就可以在该文件夹中执行任意数量的文件创建 - 就像您观察到授予访问某些特殊文件夹的权利一样。

您可以遵循的一个过程是:

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

3 - (是的,我错过了 2,见下文)如果您没有访问权限,请向用户 for 请求包含文件夹 - 抛出一个合适的 NSOpenPanel 提示他们选择包含解释为什么的文件夹。

4 - 一旦您获得访问权限保存 - 将安全范围的书签存储到应用程序“应用程序支持”目录中的文件中的该文件夹中。您可以在构建缓存时“修剪”缓存 - 任何文件夹的书签都无需在文件系统树中的任何文件夹下添加书签。这样做可以:

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

随着时间的推移使用此过程,您将积累对用户使用的文件夹的访问权限。您应该为用户提供一种清理缓存的方法。

这并不像听起来那么糟糕! HTH。

【讨论】:

  • 非常感谢老兄...您的回答非常详尽和完整...但是对我来说太头疼了...所以我采用了另一种解决方案...无论如何感谢您的帮助回答...和平...马西
  • 我需要使用 NSOpenPanel 来请求权限,因为我正在编写的文件是 styles.css.gz,而原始文件是 styles.css。我将这个类放在一起,它包含了所有逻辑以在必要时请求权限并保持该权限。 github.com/leighmcculloch/AppSandboxFileAccess
猜你喜欢
  • 2015-05-13
  • 2018-08-22
  • 2012-03-02
  • 1970-01-01
  • 2012-08-23
  • 2011-05-22
  • 1970-01-01
  • 2015-03-30
  • 2014-03-02
相关资源
最近更新 更多