iphone - 在 objective-c 中只从磁盘读取文件的一部分

标签 iphone objective-c file nsdata

我正在使用 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];

关于iphone - 在 objective-c 中只从磁盘读取文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1415967/

相关文章:

ios - 将 Pan UIGesture 转换为滑动手势

C: 无法将文件中的行存储到数组中

java - 在Java中提取部分路径

iphone - 自定义UISearchBar

ios - 调整 subview 大小时的自动布局问题

iphone - 动态、本地化 NSString

objective-c - 仅 "extern const"与 "extern"

php - 使用 php 替换文本文件中的特定行,同时保留文件的其余部分

iPhone 应用程序大小

iphone - 在没有支持变量的情况下在 Xcode 调试器中查看合成属性的值