Mac 沙盒和临时文件

Posted

技术标签:

【中文标题】Mac 沙盒和临时文件【英文标题】:Mac Sandboxing and Temp files 【发布时间】:2012-03-21 14:06:17 【问题描述】:

我正在对我的应用程序进行沙盒处理,但我遇到了一个问题,因为我使用的库在修改原始文件时会创建临时文件,例如

当它更改“Hello World.txt”中的某些内容时,它将在同一目录中创建一个“Hello World_temp.txt”文件,然后当它完成时它将交换两个文件。

这当然会破坏沙盒规则,因为您只能更改源文件,而不能在文件夹中创建其他文件。

我找不到任何关于如何处理临时文件的建议,所以我目前只是在允许我写入的应用程序容器中创建临时文件,然后交换文件。但是,如果应用程序和文件位于不同的磁盘上,那就不好了,因为这将涉及复制而不是移动。

有允许我们写入临时文件的地方吗?

最好的问候,

弗兰克

【问题讨论】:

【参考方案1】:

在 10.7.3+(也适用于 10.6 的沙盒)尝试 NSFileManager 方法 URLForDirectory:inDomain:appropriateForURL:create:error: (docs)。这应该为您提供特定卷上的临时目录。创建后,您可以使用replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error: 切换文件。

现在有些不确定:

在 10.7 -> 10.7.2 上,上述方法可能在沙盒中不起作用。相反,您可以使用函数NSTemporaryDirectory()(docs)。您可能发现replaceItemAtUrl...在沙箱下也不起作用,在这种情况下,您可以编写自己的代码来读取/写入临时返回。

【讨论】:

【参考方案2】:

NSTemporaryDirectory() 在沙盒中工作。 Swift 中的示例代码:

let path = "\(NSTemporaryDirectory())temp.txt"
"Hello world".writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding, error: nil)

【讨论】:

以上是关于Mac 沙盒和临时文件的主要内容,如果未能解决你的问题,请参考以下文章

10.7.3 之前的 Mac App Store 沙盒和处理安全范围的书签

Mac 应用程序沙盒和 forkpty()

ios - 沙盒和NSBundle

沙盒和App Group

沙盒和App Group

沙盒和App Group