1

当我调用该方法时,我在 XCode 中使用 Unrar4iOS 框架显示了一个错误 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;
4

2 回答 2

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;

}

于 2012-07-26T07:11:55.897 回答
0

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

Matt Gallagher 在Cocoa with Love上写了一篇文章,展示了如何尝试将错误很好地呈现给用户,但应该使用该代码来保持应用程序运行,因为它可能会产生不可预知的结果。

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

于 2012-07-09T23:46:44.233 回答