2015-11-02 63 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) 
}