如果您运行 unrar 的命令行版本,它会在存档无法提取时注销重要信息。我正在尝试对 unrar DLL 做同样的事情。我已经不得不对 DLL 源代码进行一些更改,以支持注册我自己的回调来正确处理提取进度。现在我想正确处理错误报告。确实没有关于使用 unrar 源的文档。
所以我有一个可以调用的工作回调函数
CommandData *Cmd
Cmd->ErrorCallback(ERAR_BAD_DATA, Arc.FileName, ArcFileName);
如果我在我的进度 DLL 旁边调用它(所以我知道回调有效),该函数效果很好,但我无法弄清楚错误在哪里被处理。具体来说,我在处理ERAR_BAD_DATA
我发现处理的代码之后extract.cpp
......但该代码似乎没有运行。我还发现了一些调用RarErrorToDll
......我也把回调放在那里,什么都没有。
任何帮助将不胜感激。
对于一些上下文,这是我之前为捕获错误所做的。
bool archiveCorrupt = false;
while((read_header_code = RARReadHeader(archive_data, &header_data)) == 0)
{
process_file_code = RARProcessFile(archive_data, RAR_EXTRACT, m_output_dir, NULL);
if(process_file_code)
{
qDebug() << "Error extracting volume!"
<< header_data.ArcName << " "
<< " with error: " << process_file_code;
archiveCorrupt = true;
break;
}
}
这种方法不起作用的原因是错误代码process_file_code
告诉您出了什么问题,但其中的存档名称header_data.ArcName
是文件开始的存档,不一定是损坏的位置。我正在处理多部分档案,其中一个大文件将跨越多个档案......所以我需要知道哪些档案已损坏,而不仅仅是文件开始的档案。
编辑:
因此,我在 extract.cpp 第 670 行中发现了一个可以放置回调的位置,它确实会向我的应用程序返回错误代码。
ErrHandler.SetErrorCode(RARX_CRC);
#ifdef RARDLL
Cmd->ErrorCallback(RARX_CRC, Arc.FileName, ArcFileName);
但是,这与以前有相同的问题,它在处理文件提取结束时返回错误,而不是在 CRC 失败的地方。
如果我运行可以从 rarlabs 站点下载的 unrar 命令行应用程序,它似乎可以正确处理它并返回正确的错误。我在 unrar 源代码的任何地方都找不到这些错误的文本,所以我只能假设 unrar 源代码实际上并没有构建他们在其网站上发布的 unrar 应用程序。
Extracting from SL - Cinematic Guitars.part02.rar
... SL - Cinematic Guitars/Cinematic Guitars/Samples/Cinematic Guitars_001.nkx 16%
SL - Cinematic Guitars/Cinematic Guitars/Samples/Cinematic Guitars_001.nkx : packed data CRC failed in volume SL - Cinematic Guitars.part02.rar