【问题标题】:Unrar4iOS error, File::tell() throws to asm code, what should I do?Unrar4iOS 错误,File::tell() 抛出 asm 代码,我该怎么办?
【发布时间】:2012-06-06 22:33:16
【问题描述】:

当我调用方法时,我在 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;

【问题讨论】:

    标签: iphone ios ipad rar unrar


    【解决方案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;
    

    }

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我找到了问题,但我无法解决它,我重新制作了 UNRAR4IOS 对象,所以它只返回给我 throw,在 try 语句中我得到错误!!
      • Cocoa 没有办法捕获 unix 信号,例如 SIGSEGV
      • 你应该重写 unrar4iOS 方法提取流:
      • while ((RHCode = RARReadHeaderEx(_rarFile, header)) == 0) { NSString *_filename = [NSString stringWithCString:header->FileName encoding:NSASCIIStringEncoding]; if ([_filename isEqualToString:aFile]) { length = header->UnpSize;休息; } else { if ((PFCode = RARProcessFile(_rarFile, RAR_SKIP, NULL, NULL)) != 0) { [self _unrarCloseFile];返回零; } } }
      • 并且正好在 RAROpenArchiveEx(flags); 之后你在 flags->OpenResult 中得到结果,如果没问题,它必须返回 0,否则返回错误,如下所示:ERAR_END_ARCHIVE = 10; ERAR_NO_MEMORY = 11; ERAR_BAD_DATA = 12; ERAR_BAD_ARCHIVE = 13; ERAR_UNKNOWN_FORMAT = 14; ERAR_EOPEN = 15; ERAR_ECREATE = 16; ERAR_ECLOSE = 17; ERAR_EREAD = 18; ERAR_EWRITE = 19; ERAR_SMALL_BUF = 20; ERAR_UNKNOWN = 21;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2021-07-11
      • 2012-03-12
      • 2018-03-20
      • 2021-08-06
      • 2021-04-27
      • 2017-03-04
      相关资源
      最近更新 更多