下载时解压缩存档

4
我有一个程序可以下载在互联网上分割的rar文件的part01,part02等部分。我的程序首先下载part01,然后下载part02等等。经过一些测试,我发现使用UnRAR2 for python(例如)可以提取包含在存档中的第一部分文件(.avi文件),并且我可以播放它几分钟。当我添加另一个文件时,它会提取更多内容,依此类推。我想知道的是:是否可以让它在下载文件的同时提取单个文件?我需要它开始提取part01而不必等待其完成下载...这可能吗?
非常感谢! Matteo

1
提醒一下,如果RAR文件使用“实体化”选项创建,则此操作可能无法正常工作。 - Alex K.
3个回答

8
您在谈论rar档案中的.avi文件。您确定这些档案实际上没有压缩吗?破解组发布的视频文件不使用压缩: 电影被剪辑后由于体积过大仍然需要打包,但是不允许使用压缩,RAR格式仅用作容器。因此,现代播放软件可以直接从打包文件中播放发行版,并在下载时甚至可以流式传输它(如果网络足够快)。
(我想到了VLC、BSPlayer、KMPlayer、Dziobas Rar Player、rarfilesource、rarfs等)
您可以按以下方式检查压缩情况:
- 在WinRAR中打开第一个.rar档案。(名称为name.part01.rar或name.rar,适用于旧款卷名) - 点击信息按钮。
如果“版本提取”指示为2.0,则该档案不使用压缩。(除非您有十年前的rar文件)您可以看到“总大小”和“压缩大小”将相等。

是否可以在下载时提取单个文件?

可以的。 当不使用压缩时,您可以编写自己的程序来提取文件。(我知道有人编写了一个脚本,直接从外部rar文件中下载电影;但它不是公开的,我没有它。)因为您提到了Python,我建议您看看Marko Kreen的rarfile 2.2,就像pyarrfs的作者所做的那样。存档只是添加了标头(rar块)的文件切成的一份副本。这将是一个复制操作,您需要暂停,直到下载下一个存档。

我强烈相信对于压缩文件也是可能的。你在这里的方法将会不同,因为你必须使用unrar来提取压缩文件。我必须补充一点,The Unarchiver中还有一个免费的RARv3实现可以提取RAR文件

我认为(un)rar的这个参数将会使其成为可能:

-vp     Pause before each volume

        By default RAR asks for confirmation before creating
        or unpacking next volume only for removable disks.
        This switch forces RAR to ask such confirmation always.
        It can be useful if disk space is limited and you wish
        to copy each volume to another media immediately after
        creation.

它将为您提供暂停提取的可能性,直到下载下一个存档。

我认为如果启用了“固实”选项创建rar,则这将无法正常工作。

当使用rars的固实选项时,所有打包文件都被视为一个大文件流。即使不包含要提取的文件,如果始终从第一个文件开始,这不应该会造成任何问题。 我还认为它可以处理有密码的存档。


1

我非常怀疑。根据我的理解,压缩的本质是每一位都需要用来解压缩。看起来你下载的源文件在压缩之前被故意分成了几部分,但是一旦你应用压缩,任何你压缩的东西现在都是一个原子单位。所以他们把整个avi文件好心地分成了几部分,但每个部分仍然是一个原子单元。

但是我不是压缩方面的专家。

我目前唯一能想到的测试是像这样做:curl http://example.com/Part01 | unrar


0

我不知道是否有特定编程语言的要求,但是可以直接从互联网流式传输压缩的RAR文件并动态解压缩。我可以使用我的C#库http://sharpcompress.codeplex.com/实现这一点。

RAR格式其实非常好用。它在每个条目之前都有标头,压缩数据本身不需要对字节流进行随机访问。

如果是多部分文件,则必须完全提取第1部分,然后在可用第2部分时继续写入。

我的RarReader API可以实现所有这些功能。实际上,固体存档也是可流式传输的(事实上,它们只能流式传输。您无法在固体存档中随机访问文件。基本上必须一次性将它们全部提取出来。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接