【发布时间】:2021-08-20 16:41:10
【问题描述】:
我试图让用户选择将文件保存在他/她选择的目录中。当我弹出一个NSOpenPanel() 让用户选择目录时,我可以在那里保存一个文本文件。但是,如果我保存该路径并稍后尝试在其中保存更多文件而不再次打开NSOpenPanel(),则会出现错误。
是的,我知道应用程序的沙盒性质,因此我要求用户选择一个文件夹。
如何将文件保存到用户选择的目录,并确保应用程序可以继续在该目录中保存文件。
这是我尝试过的代码。
打开面板:
func saveNewFile(filename: String) {
let contents = "Some text..."
@AppStorage("filesDirectory") var filesDirectory: String = ""
print("saving in: \(filesDirectory)")
do
{
let panel = NSOpenPanel()
panel.allowsMultipleSelection = false
panel.canChooseDirectories = true
panel.canChooseFiles = false
if panel.runModal() == .OK {
filesDirectory = panel.url?.path ?? "<none>"
}
let directoryURL: URL = panel.url!
let documentURL = directoryURL.appendingPathComponent (filename + ".txt")
print(documentURL)
try contents.write (to: documentURL, atomically: false, encoding: .utf8)
}
catch
{
print("An error occured: \(error)")
}
}
没有它
func saveNewFile(filename: String) {
let contents = "Some text..."
@AppStorage("filesDirectory") var filesDirectory: String = ""
print("saving in: \(filesDirectory)")
do
{
/*let panel = NSOpenPanel()
panel.allowsMultipleSelection = false
panel.canChooseDirectories = true
panel.canChooseFiles = false
if panel.runModal() == .OK {
filesDirectory = panel.url?.path ?? "<none>"
}*/
let directoryURL: URL = URL(string: filesDirectory)!
let documentURL = directoryURL.appendingPathComponent (filename + ".txt")
print(documentURL)
try contents.write (to: documentURL, atomically: false, encoding: .utf8)
}
catch
{
print("An error occured: \(error)")
}
}
【问题讨论】:
-
你得到了什么错误?
-
错误:发生错误:错误域=NSCocoaErrorDomain Code=518“文件无法保存,因为不支持指定的 URL 类型。” UserInfo={NSURL=/Users/aleph/test/myfiles/newfile.txt}
-
您必须创建一个 Security Scoped Bookmark,如 here 所述。无论如何
URL(string是错误的。你必须使用URL(fileURLWithPath -
不要混合使用 URL 和字符串路径,您正在保存一个文件路径,但在读取它时您将其视为 url。请改用
URL(fileURLWithPath: filesDirectory)。 -
@joakim 谢谢,现在返回““您无权将文件“newfile.txt”保存在“myfiles”文件夹中。”那么,我如何保存文件而不必每次都要求用户选择一个目录?
标签: swift macos macos-big-sur