iosnsfilehandleassetslibrary

iOS ALAssetsLibrary and NSFileHandle reading file contents


I want to read the contents of an assets library file in iOS

NSFileHandle fileHandleForReadingFromUrl using the asset defaultRepresentation url seems to always return 0x0...

I'll keep looking for a solution in the mean time.

EDIT:

Looks like the answer from Anomie might be what I want:

NSUInteger length = [representation getBytes:bytes fromOffset:0 length:[representation size] error:&error];


Solution

  • For larger files you probably want to copy out via a loop to read X bytes in chunks, otherwise you are liable to exhaust the on-device memory.

    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;