无法在MacOS应用中创建新目录

时间:2018-06-12 12:34:40

标签: macos nsfilemanager

我正在开发一款mac app。我一直在努力在Mac OS上的“桌面”中创建一个目录。我在High Sierra工作。它工作正常,但突然应用程序无法在桌面中创建目录。我收到以下权限错误。我正在使用Xcode 9.3和swift 4.1。

Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “TestDir” in the folder “Desktop”." UserInfo={NSFilePath=/Users/sj/Library/Containers/com.user.TestSync/Data/Desktop/TestDir, NSUnderlyingError=0x60400044cc60 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"

这是我的代码:

class DBManager: NSObject {
    static func getDirectoryPath() -> URL {
        let homeDirectory = URL(fileURLWithPath: NSHomeDirectory())
        let desktopPath = homeDirectory.appendingPathComponent("Desktop")
        let databaseFolder = desktopPath.appendingPathComponent("TestDir")

        return databaseFolder
    }

    static func createFolderIfNotExist() {
        let databaseFolder = DBManager.getDirectoryPath()

        if !FileManager().fileExists(atPath: databaseFolder.path) {
            do {
                try FileManager.default.createDirectory(atPath: databaseFolder.path, withIntermediateDirectories: true, attributes: nil)
            } catch {
            print(error)
            }
        }
    }
}

如果我要在“文档”中创建目录,代码可以正常工作。但由于某些原因,即使我已经为每个人提供了桌面的读/写访问权限,我也无法在桌面内创建。我还包括了我必须创建的目录的屏幕截图。

我尝试在“下载”中创建一个目录,但以相同的权限问题结束。但是,我再次成功地在“Library”中创建目录。因此,似乎操作系统没有授予创建内部别名目录的权限,因为桌面和下载都是别名。

非常感谢任何帮助。

enter image description here

3 个答案:

答案 0 :(得分:4)

这是因为您的macOS应用程序正在“App Sandbox”中运行,请检查目标设置中的“功能”选项卡。

~/Library/Containers/%BundleID%/Data/Desktop是指向用户桌面的软链接,您没有写入权限(取决于您的权利文件甚至读取权限)。

根据您的使用情况,您可以

  • 禁用沙盒模式
  • 让用户通过打开“打开”对话框选择一个文件夹(然后你可以写这个)
  • 在其他受保护用户文件夹(如Downloads等)或
  • 中启用读/写
  • 直接在主目录中创建TestDir,而不使用任何软链接文件夹

答案 1 :(得分:0)

除了@ChaosCoder提到的,我们还需要将NSOpenPanel.canCreateDirectories设置为true:

panel.canCreateDirectories = true

答案 2 :(得分:0)

从您的功能中删除应用沙箱数据。 在文件导航器中单击您的项目,然后在“目标”选项卡中单击您的项目,然后确保选择了“签名和功能”,然后选择“全部”,然后双击“应用程序沙箱”旁边的“ x”。

enter image description here