iPhone-来自本地文件URL的NSData


85

我有一个NSURL对象,它为我提供了本地文件的路径(在documents文件夹中)。我想NSData用此文件的内容填充对象。尝试使用,dataWithContentsOfURL:但这失败。我知道该文件存在,因为iPhoneSDK返回了路径。

有人可以告诉我如何NSDataURL本地文件中获取对象吗?

谢谢。


“但失败了”是什么意思?
马可(Marco)2009年

意味着此时冻结!给出一个例外。我正在尝试访问视频的数据,该数据的网址是我们从UIImagePickerController获得的
lostInTransit

似乎您正在尝试传递不是NURL的对象。您如何获取文件URL,确定是URL而不是NSString?
马可(Marco)2009年

@AliKhaki:请不要进行琐碎的编辑,审阅队列中需要两个人来查看您的更改。如果您编辑问题以改善问题,请随时删除“谢谢”之类的无用内容,但不要仅为此编辑问题。谢谢!
Cris Luengo

Answers:


163
// Given some file path URL: NSURL *pathURL
// Note: [pathURL isFileURL] must return YES
NSString *path = [pathURL path];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];

SWIFT代码:

let data = FileManager.default.contents(atPath: path)

1
contentsOfFile采用NSString及其文件路径。我正在获取NSURL对象。
lostInTransit

我不确定,但是使用defaultManager而不是alloc初始化可能会导致线程问题。
carlossless

2
的NSFileManager文档有这下线程注意事项说:“共享的NSFileManager对象的方法可以从多个线程安全地叫。” 他们注意到的唯一例外是,如果您打算处理文件管理器操作中的委托回调,请参见。我认为这并不适用。
2013年

请注意,该路径是文件的“完整路径”,您可以在XCode的文件检查器中找到它
Burak

29

要完成这项工作,您只需要执行以下操作:

NSURL *imgPath = [[NSBundle mainBundle] URLForResource:@"search" withExtension:@"png"];
NSString*stringPath = [imgPath absoluteString]; //this is correct  

//you can again use it in NSURL eg if you have async loading images and your mechanism 
//uses only url like mine (but sometimes i need local files to load)
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringPath]];
UIImage *ready = [[[UIImage alloc] initWithData:data] autorelease];

2

确保您的本地URL以“ file://”开头, 那么您只需执行以下操作:

 NSData *fileData = [NSData dataWithContentsOfFile:fileURL.path];

网址始终返回为资产图书馆://asset/asset.MOV?id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70&ext = MOV @ahbou
Mansuu ....

仅对资产(照片和视频)有效。OP正在询问“文档”文件夹中的文件
ahbou

当我从asset_library的选定URL中创建数据对象时,它给我的值为@ahbou
Mansuu...。

资产仅由AssetsLibrary或Photos.framework处理。要检索资产,您需要调用asset.assetForURL {}搜索此方法或提出一个新问题,因为这是一个单独的主题。
阿布


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.