【问题标题】:Cannot Create New Directory in MacOS app无法在 MacOS 应用程序中创建新目录
【发布时间】:2018-11-21 20:43:40
【问题描述】:

我正在开发一个 Mac 应用程序。我一直在努力在 Mac OS 上的“Desktop”中创建一个目录。我正在研究高山脉。它工作正常,但突然应用程序无法在桌面中创建目录。我收到以下权限错误。我正在使用 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)
            }
        }
    }
}

如果我要在“Documents”中创建一个目录,该代码可以正常工作。但是由于某种原因,即使我向所有人提供了 Desktop 的读/写访问权限,我也无法在 Desktop 内部创建。我还附上了我必须创建的目录的屏幕截图。

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

非常感谢任何帮助。

【问题讨论】:

标签: macos nsfilemanager


【解决方案1】:

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

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

根据您的用例,您可以

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

【讨论】:

  • 哦,我的错。我已经检查了 App Sandbox,因为我经常遇到网络问题,修复是启用我必须启用 App Sandbox 的传入连接/传出连接,但我不知道我必须在之后重新禁用 App Sandbox启用这两个选项进行网络修复。我的一整天都因为这个而浪费了。感谢您指出问题。禁用沙盒模式,问题已解决。
【解决方案2】:

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

panel.canCreateDirectories = true

【讨论】:

  • 对我没有影响。
【解决方案3】:

从您的功能中删除应用沙盒数据。 在文件导航器中单击您的项目,然后在 TARGETS 选项卡中单击您的项目,然后确保选择“Signing & Capabilities”,然后选择“ALL”,然后双击“App Sandbox”旁边的“x”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多