2015-11-02 66 views
6

在iOS系统9+我得到任何企图从文件中读取一个零。这种情况下的文件是一个图像文件路径。
使用的iOS 9读取文件权限

NSData(contentsOfFile: stringpath, options: NSDataReadingOptions.DataReadingUncached) 

NSData(contentsOfFile: stringpath) 

操作:从路径,它现在有一个权限问题:
我已删除了 “//文件”。

错误域= NSCocoaErrorDomain代码= 257“文件‘IMG_0048.JPG’无法打开,因为您没有权限查看它。”的UserInfo = {NSFilePath =的/ var /移动/媒体/ DCIM/100APPLE/IMG_0048.JPG,NSUnderlyingError = 0x13f978f50 {错误域= NSPOSIXErrorDomain代码= 1 “操作不允许”}}

我已经添加了NSAllowArbitraryLoads和将其设置为true。
我试图寻找自己使用“NSSearchPathDirectory”但是路径不以任何方式

+0

你是如何获得这些路径?好像你正在访问摄像头/画廊的图像 –

+1

错误的路径。首先以字符串格式获取路径。然后使用文件路径查找URL。然后在给定的网址找到内容。 –

+0

使用https://github.com/mikaoj/BSImagePicker PHAsset具有一个名为“PHImageFileURLKey”的值,它是图像的路径 –

回答

1

你最有可能得到这个错误匹配文件,因为iOS应用程序只能有它的沙箱中对文件的访问。有关详细信息,请参阅文件系统上的Apple documentation

4

我,因为我尝试访问同一个块的多个文件时遇到这个错误。修复工作对我来说是改变了代码结构,使得每个文件的url被获取,然后读取,然后尝试获取下一个文件url。

+0

你碰巧知道为什么会发生这种情况?另外,如何获取每个网址?它来自AVAsset吗? – Shade

+1

我有类似的问题。我通过'PHImageManager.defaultManager()。requestAVAssetForVideo()'获得文件系统URL。如果我尝试从'NSFileManager'多次使用该URL,我第二次得到一个错误。在我的情况下,我有一个解决方法:我复制文件,然后用它做一些其他的事情。如果我访问第二个“NSFileManager”操作的新副本(而不是原始副本),它将起作用。必须是安全的事情。奇怪的... –

0

在应用程序中,你不必因为沙盒的权限访问的/var/mobile/Media/DCIM/100APPLE/IMG_0048.JPG文件。

因此,无论您做什么,都无法使用文件路径初始化NSDataUIImage。但是您可以使用AVURLAsset访问/var/mobile/Media/DCIM/100APPLE/xxx.mov的文件。在我的应用程序中,我通过照片工具包从图库中提取了数据而不是网址,并用数据初始化了UIImage

PHImageManager.default().requestImageData(
    for: assetObject!, options: options, 
    resultHandler: { 
     data, _, _, _ in 
     if data != nil { 
      self.assetUrl = movieMaker.createMovieFrom(imageData: data!, duration: Int(CXPreparetValue.imageDuration)) 
     } 
}) 

它适合我!如果您有其他意见,请告诉我。

0

在我的情况下,该文件的权限过于严格,所以我不能读取文件。

访问它解决它之前添加读+写权限的文件。

do { 
    // Retrieve any existing attributes 
    var attrs = try FileManager.default.attributesOfItem(atPath: stringpath) 
    let existing = (attrs as NSDictionary).filePosixPermissions() 
    // Set the read+write value in the attributes dict 
    attrs[.posixPermissions] = existing | 0b110000000 
    // Update attributes 
    try FileManager.default.setAttributes(attrs, ofItemAtPath: stringpath) 

    // Read data from file 
    let data = try Data(contentsOf: URL(fileURLWithPath: stringpath, isDirectory: false), options: .uncached) 
    print("success: \(data.count)") 
} catch { 
    print(error) 
}