NSData - 写入临时文件/目录

Posted

技术标签:

【中文标题】NSData - 写入临时文件/目录【英文标题】:NSData - Write to temporary file / directory 【发布时间】:2017-04-05 09:55:38 【问题描述】:

我有点迷失了——

    下载 CKAsset(PDF 文件) 分配临时文件名 将 CKAsset 的内容写入文件名

我已设法下载 CKAsset 并在 UIWebView 中显示内容,但是我在第 2 步和第 3 步中遇到了麻烦,我有一个来自字符串的文件名,尽管尝试了各种 WriteToFile 组合,但我收到了错误。

我的代码是这样的:

let filename = record.object(forKey: "materialsFilename")

                        if  materialsType == "PDF" || materialsType == "pdf" 


                            if let asset1 = record.object(forKey: "materialsFile") as? CKAsset 
                                let doc1Data : NSData? = NSData(contentsOf:asset1.fileURL)

                                let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename as! String)


                                let contentsOfFile = doc1Data
                                var error: NSError?

                                // Write File
                                if contentsOfFile.writeToFile(path, atomically: true, encoding: String.Encoding.utf8, error: &error) == false 
                                    if let errorMessage = error 
                                        print("Failed to create file")
                                        print("\(errorMessage)")
                                    
                                 else 
                                    print("File \(filename) created at tmp directory")
                                

此版本出现错误 -

不能使用类型为 '(URL?, 原子:Bool,编码:String.Encoding,错误:inout NSError?)'

一旦创建的临时文件将被传递给 UIActivityViewController,以打印/电子邮件/空投 PDF,只有 CKAsset 名称,UIActivityViewController 无法将文件类型与任何用户安装的应用程序相关联,保存以供打印。

【问题讨论】:

能否在“contentsOfFile.writeToFile”之前设置断点? -> “路径”有什么价值。如果为空,则无法写入特定文件。也许 te 文件名是错误的?另一个选项:在末尾设置断点。 “错误”包含什么? 在该阶段的路径似乎是CKAsset路径 - 路径=〜/库/缓存/ CloudKit / 48e71b0c5ca5e4eb9add0599a376bae1d958ed3e /资产/ 40118308-8136-4A66-8321-66AD609798A6.01707e7ffadfd047f02bc4a1579e6bcd2dbadf2c0b,大小= 268270, UUID=40118308-8136-4A66-8321-66AD609798A6,签名= 是否允许写入云端/使用用户的 iCloud? 【参考方案1】:

在摸索了一下并按照上面的指示检查了我的选择之后,我改变了策略,并不真的需要写入文件,只需重命名 CKAsset,这是我使用以下脚本实现的 -

let materialsType = record.object(forKey: "materialsType") as! String

                        let filename = record.object(forKey: "materialsFilename") as! String

                        if  materialsType == "PDF" || materialsType == "pdf" 

                            if let asset1 = record.object(forKey: "materialsFile") as? CKAsset 

                                let doc1Data : Data? = Data(contentsOf:asset1.fileURL) as Data?
                                let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)
                                self.materialsWebView.load(doc1Data! as Data, mimeType: "application/pdf", textEncodingName: "UTF-8", baseURL: NSURL() as URL)
                                self.filenameURL = [(fileURL)]
                            

关键似乎取决于两条线 -

let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)

self.filenameURL = [(fileURL)]

它会为 UIActivityViewController 生成文件名,从而打开对许多其他应用程序的访问。

【讨论】:

【参考方案2】:

您确定您使用的是正确的writeToFile 方法吗? NSData reference 没有显示与您使用的签名相同的方法。尝试使用参考中列出的其中一种。

【讨论】:

【参考方案3】:

我只在Data类中找到以下函数。

func write(to: URL, options: Data.WritingOptions)

试试这个。

【讨论】:

我建议你在 Swift 3 中使用 Data 而不是 NSData。

以上是关于NSData - 写入临时文件/目录的主要内容,如果未能解决你的问题,请参考以下文章

使用 Yii 无法写入 mPDF 临时文件

病毒扫描程序锁定和删除临时文件 - 应对它们的最佳方法?

自学Linux Shell14.3-创建临时文件

Confluence 6 临时目录(安装目录)

Spark_临时创建原因

我可以创建一个引用内存中 NSData 的 NSURL 吗?