سؤال

وأنا أقرأ ملف كبير جدا باستخدام NSInputStream وإرسالها إلى الجهاز في الحزم. إذا كان المتلقي لا تحصل على حزمة، ويمكنني أن أرسل مرة أخرى إلى المرسل مع عدد حزمة، وهو ما يمثل الموقع اعتبارا من عام بايت من الحزمة في عداد المفقودين.

وأنا أعرف NSInputStream لا يمكن الترجيع والاستيلاء على الحزمة، ولكن هناك طريقة أخرى للاستيلاء على نطاق البايت المطلوبة دون تحميل ملف كبير بأكمله في الذاكرة؟

إذا كان هناك [NSData dataWithContentsOfFileAtPath: inRange]. الأسلوب، فإنه سيكون مثاليا

هل كانت مفيدة؟

المحلول

يمكنك لف مع NSInputStream:

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

نصائح أخرى

وأنا لا أعتقد أن هناك وظيفة القياسية التي يفعل ذلك، ولكن هل يمكن أن يكتب واحد نفسك، وذلك باستخدام فئة وAPI C stdio:

@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