无法在 MacOS 应用程序中创建新目录
Cannot Create New Directory in MacOS app
我正在开发 mac 应用程序。我一直在努力在 Mac OS 上的“Desktop”中创建一个目录。我正在研究 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)
}
}
}
}
如果我要在“Documents”中创建一个目录,代码工作正常。但出于某种原因,即使我已向所有人提供 read/write 对桌面的访问权限,我也无法在桌面内创建。我还包括了我必须创建一个目录的屏幕截图。
我试图在 "Downloads" 中创建一个目录,但以同样的权限问题结束。但是,我再次成功地在 "Library" 中创建了目录。因此,似乎 OS 没有授予在别名目录中创建的权限,因为桌面和下载都是别名。
非常感谢任何帮助。
那是因为您的 macOS 应用程序在 "App Sandbox" 中 运行,检查您在目标设置中的 "Capabilities" 选项卡。
~/Library/Containers/%BundleID%/Data/Desktop
是对用户桌面的软link,你没有写权限(取决于你的权利文件甚至没有读权限)。
根据您的用例,您可以
- 禁用沙盒模式
- 让用户通过打开 "Open" 对话框来选择文件夹(然后您可以写入)
- 在其他一些受保护的用户文件夹(如
Downloads
等)中启用 read/write 或
- 直接在您的主目录中创建 TestDir,而不使用任何软 linked 文件夹
除了@ChaosCoder提到的,我们还需要将NSOpenPanel.canCreateDirectories设置为true:
panel.canCreateDirectories = true
从您的功能中删除应用沙盒数据。
在文件导航器中单击您的项目,然后在 TARGETS 选项卡中单击您的项目,然后确保选择“Signing & Capabilities”,然后选择“ALL”,然后双击“App Sandbox”旁边的“x”。
我正在开发 mac 应用程序。我一直在努力在 Mac OS 上的“Desktop”中创建一个目录。我正在研究 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)
}
}
}
}
如果我要在“Documents”中创建一个目录,代码工作正常。但出于某种原因,即使我已向所有人提供 read/write 对桌面的访问权限,我也无法在桌面内创建。我还包括了我必须创建一个目录的屏幕截图。
我试图在 "Downloads" 中创建一个目录,但以同样的权限问题结束。但是,我再次成功地在 "Library" 中创建了目录。因此,似乎 OS 没有授予在别名目录中创建的权限,因为桌面和下载都是别名。
非常感谢任何帮助。
那是因为您的 macOS 应用程序在 "App Sandbox" 中 运行,检查您在目标设置中的 "Capabilities" 选项卡。
~/Library/Containers/%BundleID%/Data/Desktop
是对用户桌面的软link,你没有写权限(取决于你的权利文件甚至没有读权限)。
根据您的用例,您可以
- 禁用沙盒模式
- 让用户通过打开 "Open" 对话框来选择文件夹(然后您可以写入)
- 在其他一些受保护的用户文件夹(如
Downloads
等)中启用 read/write 或 - 直接在您的主目录中创建 TestDir,而不使用任何软 linked 文件夹
除了@ChaosCoder提到的,我们还需要将NSOpenPanel.canCreateDirectories设置为true:
panel.canCreateDirectories = true
从您的功能中删除应用沙盒数据。 在文件导航器中单击您的项目,然后在 TARGETS 选项卡中单击您的项目,然后确保选择“Signing & Capabilities”,然后选择“ALL”,然后双击“App Sandbox”旁边的“x”。