Frage

Ich lese eine sehr große Datei ein NSInputStream verwenden und sie zu einem Gerät in Paketen zu senden. Wenn der Empfänger nicht ein Paket bekommt, kann ich mit einer Paketnummer an den Absender zurückschicken, die die Startposition in Bytes des Pakets fehlt.

Ich weiß, dass ein NSInputStream kann das Paket nicht zurückspulen und packen, aber gibt es einen anderen Weg, um die angeforderten Bytebereich zu greifen, ohne die gesamte große Datei in den Speicher zu laden?

Wenn es ein [NSData dataWithContentsOfFileAtPath: InRange]. Methode, wäre es perfekt

War es hilfreich?

Lösung

Sie können mit NSInputStream zurückspulen:

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

Andere Tipps

Ich glaube nicht, dass es eine Standardfunktion, die das tut, aber man kann man selbst schreiben, eine Kategorie und die 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

Dann können Sie diese:

// Read 100 bytes of data beginning at offset 500 from "somefile"
NSData *data = [NSData dataWithContentsOfFile:@"somefile" atOffset:500 withSize:100];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top