Unrar4iOS错误,File :: tell()抛出asm代码,我该怎么办?

时间:2012-06-01 16:55:18

标签: iphone ios ipad rar unrar

我在调用方法时使用Unrar4iOS Framework在XCode中显示错误File :: tell():

-(NSArray)unrarListFiles;

编译器向我展示了一堆错误,其中最后一个堆栈是ftell,如果有人知道,原点如果我错了,请回复... 我想要做的完整过程是从以下代码中提取归档的int文件数:

int nuberOfPages = 0;
NSLog(@"Filepath: %@", filePath);
Unrar4iOS *_unrar = [[Unrar4iOS alloc] init];
BOOL ok = [_unrar unrarOpenFile:filePath];
if (ok) {

    NSArray *files = [_unrar unrarListFiles];
    for (NSString *filename in files) {
        NSLog(@"File: %@", filename);
    }
    nuberOfPages = files.count;

    [unrar unrarCloseFile];
} else {
    [unrar unrarCloseFile];
}
[_unrar release];
return nuberOfPages;

2 个答案:

答案 0 :(得分:1)

这是因为那个。 在源代码中。

-(BOOL) unrarOpenFile:(NSString*)rarFile



-(BOOL) unrarCloseFile

上面的功能。他们没有做任何事情。

这个功能真正开放和真实关闭;

-(NSArray *) unrarListFiles {
int RHCode = 0, PFCode = 0;

    //here  if you opened a file that is not rar.
    //this function RARReadHeaderEx will EXC_BAD_ACCESS (SIGSEGV)
    //so, you can check it return value
[self _unrarOpenFile:filename mode:RAR_OM_LIST];

NSMutableArray *files = [NSMutableArray array];
while ((RHCode = RARReadHeaderEx(_rarFile, header)) == 0) {
    NSString *_filename = [NSString stringWithCString:header->FileName encoding:NSASCIIStringEncoding];
    [files addObject:_filename];

    if ((PFCode = RARProcessFile(_rarFile, RAR_SKIP, NULL, NULL)) != 0) {
        [self _unrarCloseFile];
        return nil;
    }
}

[self _unrarCloseFile];
return files;

}

答案 1 :(得分:0)

我认为这是Unrar4iOS中的一个错误,它是通过读取损坏的RAR存档(或根本不是RAR存档的文件)触发的。它尝试读取磁盘上不属于归档的地址,并抛出EXC_BAD_ACCESS (SIGSEGV)。我在GitHub项目中将其作为一个问题发布:https://github.com/ararog/Unrar4iOS/issues/6

Matt Gallagher写了一篇关于Cocoa with Love的文章,展示了如何尝试向用户很好地呈现错误,但该代码应该用于保持应用程序运行,因为它可能有不可预知的结果。

更新:为了它的价值,我将Unrar4iOS分成了一个新项目UnrarKit,它使用NSError处理错误而不是抛出异常。