无法打开文件“xxx”,因为您在导入时无权查看它
Posted
技术标签:
【中文标题】无法打开文件“xxx”,因为您在导入时无权查看它【英文标题】:Getting The file 'xxx" couldn't be opened because you don't have permission to view it when importing 【发布时间】:2020-09-29 11:22:00 【问题描述】:我是使用 Swift 和 SwiftUI 的新手,我正在尝试编写读取文件夹、计算每个文件的哈希值、然后将它们复制到外部驱动器的 ios 应用程序。
现在我正在尝试导入一个文件并计算其哈希值。但是,我总是收到同样的错误,说我没有权限查看它。
这是我的代码:
//
// ContentView.swift
// FileExporter
//
// Created by adrien le falher on 27/09/2020.
//
import SwiftUI
import CryptoKit
struct ContentView: View
@State private var document: MessageDocument = MessageDocument(message: "Hello, World!")
@State private var isImporting: Bool = false
@State private var isExporting: Bool = false
@State private var isMoving: Bool = false
var body: some View
VStack
GroupBox(label: Text("Message:"))
TextEditor(text: $document.message)
GroupBox
HStack
Spacer()
Button(action: isImporting = true , label:
Text("Import")
)
Spacer()
Button(action: isExporting = true , label:
Text("Export")
)
Spacer()
Button(action: isMoving = true , label:
Text("Export")
)
Spacer()
.padding()
.fileExporter(
isPresented: $isExporting,
document: document,
contentType: .plainText,
defaultFilename: "Message"
) result in
if case .success = result
// Handle success.
else
// Handle failure.
.fileImporter(
isPresented: $isImporting,
allowedContentTypes: [.image],
allowsMultipleSelection: false
) result in
do
print("ok")
guard let selectedFile: URL = try result.get().first else return
guard var fileBytes : String = try hashFile(selectedFile) else return
//guard let message = String(data: try Data(contentsOf: selectedFile), encoding: .utf8) else return
let message = fileBytes
print(message)
document.message = message
catch let error
print(error.localizedDescription)
document.message = error.localizedDescription
extension Data
init(reading input: InputStream) throws
self.init()
input.open()
defer
input.close()
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
defer
buffer.deallocate()
while input.hasBytesAvailable
let read = input.read(buffer, maxLength: bufferSize)
if read < 0
//Stream error occured
throw input.streamError!
else if read == 0
//EOF
break
self.append(buffer, count: read)
func hashFile (_ fileURL : URL) -> String
print(fileURL)
var hashed = ""
do
var fileBytes = try Data (contentsOf: fileURL)
//OU reading : InputStream(url: fileURL)!
print("Filebytes is \(fileBytes)")
print("Bytes" + String(fileBytes.base64EncodedString()))
let hashed = SHA256.hash(data: fileBytes)
return String(hashed.description)
catch let error
hashed = error.localizedDescription
return hashed
struct ContentView_Previews: PreviewProvider
static var previews: some View
/*@START_MENU_TOKEN@*/Text("Hello, World!")/*@END_MENU_TOKEN@*/
似乎 .fileImporter() 是新的,我无法找到有关它的信息。我不知道我是否应该(或如何)向 iOS 请求访问文件的权限;文件选择器有效,所以我不确定我做错了什么。
任何帮助将不胜感激。
谢谢。
【问题讨论】:
如果这是 Cocoa 文档选择器,我希望有一个安全范围的 URL。 【参考方案1】:在读取文件内容之前,您必须先在 URL 上调用 startAccessingSecurityScopedResource()
方法。 注意:完成后别忘了给stopAccessingSecurityScopedResource()
打电话!
您可以在Apple documentation找到更多信息。
编辑:
这是对我有用的代码:
.fileImporter(
isPresented: $isImporting,
allowedContentTypes: [.plainText],
allowsMultipleSelection: false
) result in
do
guard let selectedFile: URL = try result.get().first else return
if selectedFile.startAccessingSecurityScopedResource()
guard let fileContent = String(data: try Data(contentsOf: selectedFile), encoding: .utf8) else return
defer selectedFile.stopAccessingSecurityScopedResource()
else
// Handle denied access
catch
// Handle failure.
print("Unable to read file contents")
print(error.localizedDescription)
【讨论】:
以上是关于无法打开文件“xxx”,因为您在导入时无权查看它的主要内容,如果未能解决你的问题,请参考以下文章
FinderSync 扩展运行时错误:无法打开该文件,因为您无权查看它
Xcode 9.4 无法打开文件“my_app”,因为您无权查看它