在objective-c中只从磁盘读取一部分文件

con*_*are 8 iphone file objective-c nsdata

我正在使用NSInputStream读取一个非常大的文件,并将它们以数据包的形式发送到设备.如果接收方没有收到数据包,我可以使用数据包编号发送回发送方,表示丢失数据包的起始位置(以字节为单位).

我知道NSInputStream无法回绕并抓取数据包,但是有没有其他方法可以获取所请求的字节范围而无需将整个大文件加载到内存中?

如果有[NSData dataWithContentsOfFileAtPath:inRange]方法,那将是完美的.

Ada*_*eld 12

我不认为有这样的标准函数,但您可以自己编写一个,使用类别和C stdio API:

@interface NSData(DataWithContentsOfFileAtOffsetWithSize)
+ (NSData *) dataWithContentsOfFile:(NSString *)path atOffset:(off_t)offset withSize:(size_t)bytes;
@end

@implementation NSData(DataWithContentsOfFileAtOffsetWithSize)

+ (NSData *) dataWithContentsOfFile:(NSString *)path atOffset:(off_t)offset withSize:(size_t)bytes
{
  FILE *file = fopen([path UTF8String], "rb");
  if(file == NULL)
        return nil;

  void *data = malloc(bytes);  // check for NULL!
  fseeko(file, offset, SEEK_SET);
  fread(data, 1, bytes, file);  // check return value, in case read was short!
  fclose(file);

  // NSData takes ownership and will call free(data) when it's released
  return [NSData dataWithBytesNoCopy:data length:bytes];
}

@end
Run Code Online (Sandbox Code Playgroud)

那么你可以这样:

// Read 100 bytes of data beginning at offset 500 from "somefile"
NSData *data = [NSData dataWithContentsOfFile:@"somefile" atOffset:500 withSize:100];
Run Code Online (Sandbox Code Playgroud)


Chr*_*ter 6

您可以使用NSInputStream回放:

[stream setProperty:[NSNumber numberWithInt:offset]
             forKey:NSStreamFileCurrentOffsetKey];
Run Code Online (Sandbox Code Playgroud)