2009-09-12 74 views
8

我正在閱讀一個非常大的文件使用NSInputStream並將它們發送到數據包中的設備。如果接收方沒有收到數據包,我可以使用數據包編號發回給發送方,代表丟失數據包的起始位置(以字節爲單位)。只讀文件的一部分從磁盤在objective-c

我知道一個NSInputStream不能倒帶和抓取數據包,但有沒有另一種方法來抓取請求的字節範圍,而無需將整個大文件加載到內存中?

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

+0

你的意思是NSInputStream? – Tim 2009-09-12 20:08:15

+0

是的。我的意思是一個NSInputStream。對不起,我感到困惑 – coneybeare 2009-09-12 20:36:06

+0

你對設備的功能有任何控制嗎?它是否可能爲接收到的數據包發送ack,因此您將數據包保存在內存中並重新發送,直到您收到確認? – 2009-09-12 21:14:04

回答

5

你可以用NSInputStream倒帶:

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

不適用於我的情況 – 2013-07-12 06:22:16

12

我不認爲有,做一個標準功能,但你可以自己寫一個,使用類別和C標準輸入輸出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]; 
+0

我應該釋放NSData對象在調用函數? – 2012-04-21 16:48:23