无法打开文件“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 6.1 - 无法打开 Nib,因为您无权查看它

Xcode 9.4 无法打开文件“my_app”,因为您无权查看它

xcode 12:无法打开文件“app name”,因为您无权查看它

xcodeproj 文件权限

项目文件无法构建错误您无权查看它