2009-09-12 17 views
8

NSInputStreamを使用して非常に大きなファイルを読み取り、デバイスにパケットで送信しています。受信者がパケットを取得しない場合は、パケット番号の入った送信者に返信することができます。パケットの開始位置がバイト単位で失われています。objective-cのディスクからファイルの一部だけを読み込みます。

NSInputStreamはパケットを巻き戻して取得できないことは知っていますが、大きなファイル全体をメモリにロードせずに要求されたバイト範囲を取得するもう1つの方法はありますか?

[NSData dataWithContentsOfFileAtPath:inRange]メソッドがあれば、それは完璧です。

私がいることを行い、標準的な機能はないと思うが、あなたは、カテゴリおよびC stdioのAPIを使用して、1を自分で書くことができ
+0

あなたはNSInputStreamを意味しますか? – Tim

+0

はい。私はNSInputStreamを意味しました。混乱して申し訳ありません – coneybeare

+0

あなたはデバイスが何をしているかを制御できますか?おそらく、受け取ったパケットに対してackを送り返すことができるでしょうか?それで、あなたはackを受け取るまでパケットをメモリに保存して再送しますか? –

答えて

5

あなたはNSInputStreamを巻き戻すことができます。

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

私の場合は動作しません –

12

@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オブジェクトを呼び出し元関数でリリースする必要がありますか? –

関連する問題