边下载边解压缩unrar文件
我有一个程序,可以从网上下载分成多个部分的rar文件,比如part01、part02等等。我的程序先下载part01,然后是part02,依此类推。经过一些测试,我发现用Python的UnRAR2这个工具,我可以提取压缩包里的第一个部分(一个.avi文件),并且可以播放前几分钟。当我添加另一个文件时,它会提取更多内容,依此类推。我想知道的是:能不能在下载的同时提取单个文件?我希望能在下载part01的时候就开始提取,而不必等它下载完……这样可以吗?
非常感谢!
Matteo
3 个回答
我不知道这个问题是否是针对某种特定语言提出来的,但其实可以直接从网上流式传输压缩的RAR文件,并且可以实时解压。我可以用我的C#库来做到这一点,链接在这里:http://sharpcompress.codeplex.com/
RAR格式其实挺不错的。它在每个文件前面都有头信息,而且压缩的数据在字节流中不需要随机访问。
如果是多部分文件,你需要先完全解压第一部分,然后等第二部分可用时再继续写入。
这一切都可以通过我的RarReader API来实现。固态压缩包也是可以流式传输的(实际上,它们只能流式传输。你不能随机访问固态压缩包里的文件。你基本上需要一次性解压所有文件。)
我对此表示怀疑。根据我对压缩的理解,解压缩时每一个比特都很重要。看起来你下载的那个文件在压缩之前,来源方故意把avi文件分成了几部分,但在你进行压缩的时候,压缩后的内容就变成了一个整体。所以他们把整个avi文件分成了几个部分,但每个部分依然是一个完整的单元。
不过我对压缩方面的知识并不多。
我现在能想到的唯一测试方法是这样的:curl http://example.com/Part01 | unrar
。
你在说的是一个在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来提取压缩文件。我还要补充一下,还有一个免费的RARv3实现可以提取rar文件,这个是The Unarchiver实现的。
我认为这个(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是用“固态”选项创建的,这个方法就不行了。
当使用固态选项时,所有打包的文件会被视为一个大文件流。如果你总是从第一个文件开始,即使它不包含你想提取的文件,这也不应该造成任何问题。我也认为这对于有密码的压缩包是可行的。