簡體   English   中英

在objective-c中只從磁盤讀取一部分文件

[英]Read only a portion of a file from disk in objective-c

我正在使用NSInputStream讀取一個非常大的文件,並將它們以數據包的形式發送到設備。 如果接收方沒有收到數據包,我可以使用數據包編號發送回發送方,表示丟失數據包的起始位置(以字節為單位)。

我知道NSInputStream無法回繞並抓取數據包,但是有沒有其他方法可以獲取所請求的字節范圍而無需將整個大文件加載到內存中?

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

我不認為有這樣的標准函數,但您可以自己編寫一個,使用類別和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];

您可以使用NSInputStream回放:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM