【问题标题】:Can't save file on iOS 14.1无法在 iOS 14.1 上保存文件
【发布时间】:2021-03-04 12:24:07
【问题描述】:

我已经杀死了几天试图保存文件并将其列出在主目录中。

首先我检索一个主目录 URL。 我尝试了两种选择:

docDir = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
docDir = URL(fileURLWithPath: NSHomeDirectory())

以任何方式在模拟器或我的 iPhone 上运行时,它只会导致 file:/// 好吧,对于沙盒化的 iOS 应用来说,这也许没问题...

之后,我准备了一个文件 URL。我尝试了两种方法:

let file = docDir.appendingPathComponent("myfile.tmp")
let file = URL(fileURLWithPath: "myfile.tmp")
print(file.absoluteURL)

我在这里得到file:///myfile.tmp(两种变体)

最后我尝试创建文件

        do {
            try  Data(count: 0).write(to: file2)
        }
        catch {
            print("Failed to create file: '\(file)' because of: \(error)")
        }

这就是我得到的

在模拟器上:

创建文件失败:'./myfile.tmp -- file:///' 因为:错误 Domain=NSCocoaErrorDomain Code=642 "你不能保存文件 “myfile.tmp”,因为卷“AirHD — данные”是只读的。” UserInfo={NSFilePath=/myfile.tmp, NSUnderlyingError=0x600000dea1f0 {Error Domain=NSPOSIXErrorDomain Code=30 "只读文件系统"}}

在 iPhone 上:

创建文件失败:'./myfile.tmp -- file:///' 因为:错误 Domain=NSCocoaErrorDomain Code=513 "你没有保存权限 “系统”文件夹中的文件“myfile.tmp”。” UserInfo={NSFilePath=/myfile.tmp, NSUnderlyingError=0x281725a40 {错误 Domain=NSPOSIXErrorDomain Code=1 "不允许操作"}}

但为什么在“系统”文件夹中? 它应该是我的 Documents 文件夹!

UPD:在 Info.plist 文件中设置密钥 UIFileSharingEnabledLSSupportsOpeningDocumentsInPlace 也没有帮助。

【问题讨论】:

  • URL(fileURLWithPath: NSHomeDirectory()) 错误
  • 尝试let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("file.txt") 然后try Data([97,98,99]).write(to: fileURL, options: .atomic)。这将创建一个带有 abc 字符串内容的文本文件
  • 谢谢!您的评论确实帮助我找到了问题!

标签: ios swift url nsfilemanager


【解决方案1】:

经过更多查询,我发现了问题! 这是因为我将 docDir 包裹到了 @State 修饰符中 其实是

@State var docDir = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

由于某种原因,这个修饰符将实际 URL 变成了file:///

【讨论】:

  • 只需确保在初始化 URL 时,如果您的字符串具有 file:// 前缀以使用 URL(string:) 初始化器,否则使用 URL(fileURLWithPath:)。此外,当从 url 获取字符串时,absoluteString 将包含方案 file://path 不会。
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 2015-07-16
  • 2014-03-27
  • 2022-11-18
  • 2020-01-30
  • 2020-01-30
  • 2019-01-23
  • 2020-04-17
相关资源
最近更新 更多