I have the following code for reading a file in length of specific size:
int chunksize = 1024;
NSData* fileData = [[NSFileManager defaultManager] contentsAtPath:URL];
NSString* fileName = [[message.fileURL lastPathComponent] stringByDeletingPathExtension];
NSString* extension = [[message.fileURL pathExtension] lastPathComponent];
NSFileHandle* fileHandle = [NSFileHandle fileHandleForReadingAtPath:[self retrieveFilePath:fileName andExtension:extension]];
file=@"test.png";
int numberOfChunks = ceilf(1.0f * [fileData length]/chunksize); //it s about 800
for (int i=0; i<numberOfChunks; i++)
{
NSData *data = [fileHandle readDataOfLength:chunksize];
....//some code
}
// read a chunk of 1024 bytes from position 2048
NSData *chunkData = [fileHandle readDataOfLength:1024 fromPosition:2048];//I NEED SOMETHING LIKE THIS!!
You need to set the file pointer to the offset you want to read from:
[fileHandle seekToFileOffset:2048];
And then read the data:
NSData *data = [fileHandle readDataOfLength:1024];
Be aware that errors are reported in the form of NSExceptions
, so you'll want some @try/@catch
blocks around most of these calls. In fact the use of exceptions to report errors means I often make my own file-access functions to ease their use; for example:
+ (BOOL)seekFile:(NSFileHandle *)fileHandle
toOffset:(uint32_t)offset
error:(NSError **)error
{
@try {
[fileHandle seekToFileOffset:offset];
} @catch(NSException *ex) {
if (error) {
*error = [AwzipError error:@"Failed to seek in file"
code:AwzipErrorFileIO
exception:ex];
}
return NO;
}
return YES;
}