FileManager returns url 用 Nil 而不是文件

FileManager returns url with Nil instead of file on it

用户从我稍后将使用的 UIDocumentPickerViewController 中选择文档。文档选择器委托调用并给我 url 文件,但根本没有文件。

这就是我创建 documentPicker 的方式。我使用 supportedFiles 因为手动输入扩展名对我不起作用

let supportedFiles: [UTType] = [UTType.data]
let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: supportedFiles)
documentPicker.delegate = self
documentPicker.modalPresentationStyle = .fullScreen
present(documentPicker, animated: true, completion: nil)

有包含所有检查的 documentPicker 委托

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {

        var path = urls.first!.path
        let stream = InputStream(url: URL(fileURLWithPath: path))
        print(path)
        print(FileManager.default.fileExists(atPath: path))

        do {
            let items = try FileManager.default.contentsOfDirectory(atPath: path)
            print(items.count)
            for item in items {
                print("Found (item)")
            }
        } catch {
            print(error)
        }

        do {
            let csv = try CSVReader(stream: stream!)
            print("Everything is ok")
            while let row = csv.next() {
                print(row)
            }
        } catch {
            print(error)
        }
    }

控制台显示这个

/private/var/mobile/Containers/Shared/AppGroup/3232A257-B8F6-4F39-A12B-A7192EBF9524/File Provider Storage/Games.csv
false
Error Domain=NSCocoaErrorDomain Code=256 "The file “Games.csv” couldn’t be opened." UserInfo={NSUserStringVariant=(
    Folder
), NSFilePath=/private/var/mobile/Containers/Shared/AppGroup/3232A257-B8F6-4F39-A12B-A7192EBF9524/File Provider Storage/Games.csv, NSUnderlyingError=0x282a277e0 {Error Domain=NSPOSIXErrorDomain Code=20 "Not a directory"}}
cannotOpenFile

据我所知,我得到的文件 url 不存在?那为什么fileManager给我一个错误,说这个文件不是一个目录,而不是说这个url什么都没有?还有一个错误,我没有权限读取这个文件,所以我把它改成了可读的。那就是说它能看到它,但它不能?就是不明白。

还尝试通过删除 /private 来更改路径,但没有成功

更新:

当试图获取 Games.svc 所在文件夹中的项目列表时,出现另一个错误

Error Domain=NSCocoaErrorDomain Code=257 "The file “File Provider Storage” couldn’t be opened because you don’t have permission to view it." UserInfo={NSUserStringVariant=(
    Folder
), NSFilePath=/private/var/mobile/Containers/Shared/AppGroup/3232A257-B8F6-4F39-A12B-A7192EBF9524/File Provider Storage/, NSUnderlyingError=0x2819254d0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

找到 apple documentation 有关获取目录访问权限的信息。为此编辑了我的代码,现在可以正常工作了

guard urls.first!.startAccessingSecurityScopedResource() else {
     print("Error getting access")
     return
}

defer { urls.first!.stopAccessingSecurityScopedResource() }

let path = urls.first!.path
let stream = InputStream(url: URL(fileURLWithPath: path))

do {
      let csv = try CSVReader(stream: stream!)
      print("Everything is ok")
      while let row = csv.next() {
      print(row)
}
      URL(fileURLWithPath: path).stopAccessingSecurityScopedResource()
} catch {
      print(error)
}

基本上在使用 URL 之前,您会收到使用此功能

保护 URL 的请求
guard urls.first!.startAccessingSecurityScopedResource() else {
     print("Error getting access")
     return
}

defer { urls.first!.stopAccessingSecurityScopedResource() }

并通过编写此行结束使用安全连接

URL(fileURLWithPath: path).stopAccessingSecurityScopedResource()

但是文档中编写的代码对我不起作用,错误检查(我删除了)仍然给我一个错误

更新

如果代码不工作,你可以删除这一行

defer { urls.first!.stopAccessingSecurityScopedResource() }