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() }
用户从我稍后将使用的 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() }