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 更新/删除照片?

iOS-使用ALAssetsLibrary获取相册图片视频

ALAssetsLibrary addAssetsGroupAlbumWithName 不适用于 iOS 9

iOS - ALAssetsLibrary 使用的缓存数据未更新

ALAssetsLibrary aspect Ratio Thumbnail iOS 4

在模拟器中重置 ALAssetsLibrary 的权限