2011-08-26 77 views
0

因为我并没有真正看到任何内容,并没有指出有关此问题的原始Microsoft文档或源代码似乎无法回答我所遇到的问题,我想我可能会在这里问几件事。 (德尔福标签是有,因为这就是我的开发环境是我从这个代码)CAB文件API说明

这就是说,我有几个问题的API文件没有回答。第一个:fdi_notify消息。什么是“我的责任”在于编码:fdintCABINET_INFO: fdintPARTIAL_FILE: fdintNEXT_CABINET: fdintENUMERATE:?我将通过一个例子来说明我的意思。对于fdintCLOSE_FILE_INFO,“我的责任”是关闭与给定的句柄相关的文件,并根据在fdi_notify中传递的数据设置文件的日期和时间。

我想我失去了一些东西,因为我的代码是不处理提取跨越CAB文件...任何想法如何做到这一点?

+1

你需要链接到一些背景信息,这样我们那些不知道你在说什么的人可以加快速度 –

+0

如果你想解压缩CAB文件有一个开源的替代方案:http:///www.cabextract.org。英国图书馆根据LGPL条款获得许可,可用于商业应用。 –

+0

我不确定这里的问题是什么。你的例子很清楚:当你收到'fdintCLOSE_FILE_INFO'时,你应该关闭文件并将它的日期和时间设置为你收到的值。 (我只是从你发布的内容中获得了,顺便说一句,因为你遗漏了你的问题中的重要信息,就像大卫所说的那样)。我不确定如何更清楚地说明。 –

回答

6

你还有什么比可能运行到更多的是,FDICopy只读取你传入驾驶室。它将使用fdintNEXT_CABINET以获取您在响应fdintCOPY_FILE提取任何文件跨区数据,但仅适用于调用fdintCOPY_FILE在第一个出租车上启动的文件。

要获取整个集合的目录列表,您需要在循环中调用FDICopy。每次获得fdintCABINET_INFO事件时,请保存psz1参数(下一个出租车名称)。当FDICopy返回时,检查。如果它是一个空字符串,则完成后,如果不再次用下一个cab作为新路径调用FDICopy。


fdintCABINET_INFO:这个唯一的责任是返回0,继续处理。您可以使用所提供的信息(下一个机柜的路径,下一个磁盘,路径名称,nad集标识符),但不需要。

fdintPARTIAL_FILE:根据您如何处理您的出租车,您可能可以忽略这一点。你只会在第二张和后面的图片中看到它,这是为了告诉你,特定的条目是从以前的出租车继续。如果你从第一个出租车出发,那么你已经看到了该文件的fdintCOPY_FILE。如果你正在处理随机的.cabs文件,你也不能真正使用它,因为你不会提取文件的开始。

fdintNEXT_CABINET:你可以用它来提示用户输入下一个柜一个新的目录,但对于简单的跨越支持只返回0,如果在文件名通过有效或-1,如果事实并非如此。如果您返回0并且驾驶室无效,或者是错误的,则会再次调用。最简单的方法(如果你不要求一个新的磁盘/目录),只是检查pfdin^.fdie。如果是FDIError_None第一次调用所需的驾驶室时是相等的,所以您可以返回0.如果是其他任何事情,它已经尝试至少打开一次要求的驾驶室,因此您可以返回-1作为错误。

fdintENUMERATE:我想你可以忽略这个。这不在文档中,我看过的两个cab库不使用它。它可能是以前API版本的剩余部分。

+0

这非常有用。谢谢。因此,为了提取一个span文件,我需要从开始条目开始,然后执行一个循环,调用FDICopy,并继续直到文件完成或未找到下一个CAB文件? – Glenn1234

+0

如果您想提取特定出租车上的*开始*的文件,您可以只调用一次FDICopy,并且它会使用fdintNEXT_CABINET自动请求附加出租车。如果要枚举整个集合或从多个出租车开始提取文件,则只需要在循环中调用FDICopy。 –

+0

作为一个具体的例子,从http://tpabbrevia.svn.sourceforge.net/viewvc/tpabbrevia/trunk/tests/testfiles/Canterbury/Split/下载Split.cab,.c02,.c03它们包含14个文件, 3辆出租车和第一辆驾驶室的部分文件继续进行。 WinZip只调用一次FDICopy,因此它显示7个文件; PowerArchiver在循环中调用它,以便您可以看到它们全部。如果您仅在Split.cab上使用FDICopy,则它将打开Split.c02以从Split.cab继续获取两个文件的数据,但不会返回在其上启动的文件。 –