无法打开文件“xxx”,因为您在导入时无权查看它
Getting The file 'xxx" couldn't be opened because you don't have permission to view it when importing
我是使用 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 访问文件的权限;文件选择器工作正常,所以我不确定我做错了什么。
如有任何帮助,我们将不胜感激。
谢谢。
在读取文件内容之前,您必须先调用 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)
}
}
我是使用 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 访问文件的权限;文件选择器工作正常,所以我不确定我做错了什么。
如有任何帮助,我们将不胜感激。
谢谢。
在读取文件内容之前,您必须先调用 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)
}
}