【问题标题】:read data of specific length from a specific position ios从特定位置读取特定长度的数据 ios
【发布时间】:2014-07-17 07:12:41
【问题描述】:

我有以下代码用于读取特定大小长度的文件:

  int chunksize = 1024;
  NSData*  fileData = [[NSFileManager defaultManager] contentsAtPath:URL];
  NSString* fileName = [[message.fileURL lastPathComponent] stringByDeletingPathExtension];
  NSString*  extension = [[message.fileURL pathExtension] lastPathComponent];
  NSFileHandle*  fileHandle = [NSFileHandle fileHandleForReadingAtPath:[self retrieveFilePath:fileName andExtension:extension]];
  file=@"test.png";

    int numberOfChunks =  ceilf(1.0f * [fileData length]/chunksize); //it s about 800

    for (int i=0; i<numberOfChunks; i++)
    {
        NSData *data = [fileHandle readDataOfLength:chunksize];
        ....//some code
    }

// read a chunk of 1024 bytes from position 2048
 NSData *chunkData = [fileHandle readDataOfLength:1024 fromPosition:2048];//I NEED SOMETHING LIKE THIS!!

【问题讨论】:

  • floats 是怎么回事? (ceilf()1.0f)?
  • 为了检索文件中的块总数并将实数转换为整数,我使用了该语法
  • 根本不需要涉及浮点数。
  • 你有更好的解决方案吗?:)
  • 我认为这会起作用:int numberOfChunks = ([fileData length] / chunksize) + (([fileData length] % chunksize) ? 1 : 0);

标签: ios nsfilehandle


【解决方案1】:

您需要将文件指针设置为要从中读取的偏移量:

[fileHandle seekToFileOffset:2048];

然后读取数据:

NSData *data = [fileHandle readDataOfLength:1024];

请注意,错误以NSExceptions 的形式报告,因此您需要在大多数这些调用周围使用一些@try/@catch 块。事实上,使用异常来报告错误意味着我经常制作自己的文件访问函数来简化它们的使用;例如:

+ (BOOL)seekFile:(NSFileHandle *)fileHandle
        toOffset:(uint32_t)offset
           error:(NSError **)error
{
    @try {
        [fileHandle seekToFileOffset:offset];
    } @catch(NSException *ex) {
        if (error) {
            *error = [AwzipError error:@"Failed to seek in file"
                                  code:AwzipErrorFileIO
                             exception:ex];
        }
        return NO;
    }

    return YES;
}

【讨论】:

  • 一种很好的解释方式。非常感谢你!!请问您为什么选择在 [self seekFile:fileHandler toOffset:2048 error:error] 方法前面使用 + ?你想公开吗?
  • 这是因为这是一个实用程序类,在代码中的任何地方都可以使用。该类没有状态,只是提供实用功能。
  • 这是一个用于创建自定义 NSError 对象的类,特定于问题域。您可以只使用基本的 NSError 方法或创建自己的错误生成函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多