Вопрос

Я читаю очень большой файл с помощью NSInputStream и отправляю их на устройство в пакетах. Если получатель не получает пакет, я могу отправить его отправителю с номером пакета, представляющим начальное местоположение в байтах отсутствующего пакета.

Я знаю, что NSInputStream не может перематывать и захватывать пакет, но есть ли другой способ получить запрошенный диапазон байтов без загрузки всего большого файла в память?

Если бы существовал метод [NSData dataWithContentsOfFileAtPath: inRange], он был бы идеальным.

Это было полезно?

Решение

Вы можете перемотать с NSInputStream:

[stream setProperty:[NSNumber numberWithInt:offset]
             forKey:NSStreamFileCurrentOffsetKey];

Другие советы

Я не думаю, что есть стандартная функция, которая делает это, но вы могли бы написать ее самостоятельно, используя категорию и 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

Тогда вы можете это:

// Read 100 bytes of data beginning at offset 500 from "somefile"
NSData *data = [NSData dataWithContentsOfFile:@"somefile" atOffset:500 withSize:100];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top