iOS ALAssetsLibrary 和 NSFileHandle 读取文件内容
Posted
技术标签:
【中文标题】iOS ALAssetsLibrary 和 NSFileHandle 读取文件内容【英文标题】:iOS ALAssetsLibrary and NSFileHandle reading file contents 【发布时间】:2011-08-18 02:34:44 【问题描述】:我想在 ios 中读取资源库文件的内容
NSFileHandle fileHandleForReadingFromUrl
使用资产 defaultRepresentation
url 似乎总是返回 0x0
...
与此同时,我会继续寻找解决方案。
编辑:
看起来Anomie 的答案可能是我想要的:
NSUInteger length = [representation getBytes:bytes fromOffset:0 length:[representation size] error:&error];
【问题讨论】:
Anomie 的回答可能适用于小视频,但如果您处理较大的视频,您可能需要逐块复制。请参阅下面的答案 【参考方案1】:对于较大的文件,您可能希望通过循环复制出来以读取 X 字节的块,否则您可能会耗尽设备内存。
NSUInteger chunkSize = 100 * 1024;
uint8_t *buffer = malloc(chunkSize * sizeof(uint8_t));
ALAssetRepresentation *rep = [myasset defaultRepresentation];
NSUInteger length = [rep size];
NSFileHandle *file = [[NSFileHandle fileHandleForWritingAtPath: tempFile] retain];
if(file == nil)
[[NSFileManager defaultManager] createFileAtPath:tempFile contents:nil attributes:nil];
file = [[NSFileHandle fileHandleForWritingAtPath:tempFile] retain];
NSUInteger offset = 0;
do
NSUInteger bytesCopied = [rep getBytes:buffer fromOffset:offset length:chunkSize error:nil];
offset += bytesCopied;
NSData *data = [[NSData alloc] initWithBytes:buffer length:bytesCopied];
[file writeData:data];
[data release];
while (offset < length);
[file closeFile];
[file release];
free(buffer);
buffer = NULL;
【讨论】:
@Adam - 我想编辑代码以使水平条不被炫耀(这样我就可以一次查看代码而不是左右滚动),所以我把前面一些 loc 中的一些下一行字符。 :) 但我猜这不应该带来太多的不便。 :) 我希望 SO 可以使代码部分类似于 XCode 编辑器 :) 无论如何感谢进一步编辑。 @Viren:我不确定那里发生了什么,但我的猜测是我看到以前版本的答案有部分代码没有正确缩进(因此没有标记为代码) ,当我纠正它时,它踩到了你的第二次编辑。以上是关于iOS ALAssetsLibrary 和 NSFileHandle 读取文件内容的主要内容,如果未能解决你的问题,请参考以下文章
使用 iOS ALAssetsLibrary 更新/删除照片?
ALAssetsLibrary addAssetsGroupAlbumWithName 不适用于 iOS 9
iOS - ALAssetsLibrary 使用的缓存数据未更新