我有一个程序可以下载part01,然后在互联网上分割一个rar文件的part02等。 我的程序首先下载part01,然后是part02,依此类推。 经过一些测试,我发现使用例如UnRAR2 for python我可以提取存档中包含的文件的第一部分(.avi文件),我可以在第一分钟播放它。当我添加另一个文件时,它会提取更多,依此类推。我想知道的是:是否可以在下载文件时提取单个文件? 我需要它开始提取part01而不必等待它完成下载......这可能吗?
非常感谢!
利玛
答案 0 :(得分:7)
您正在谈论rar档案中的.avi文件。你确定档案实际上是压缩的吗? Video files released by the warez scene do not use compression:
由于文件大小,仍然打包翻录的电影,但不允许压缩,RAR格式仅用作容器。因此,现代播放软件可以直接从打包文件中轻松播放,甚至可以在下载版本时将其流式传输(如果网络速度足够快)。
(我在想VLC,BSPlayer,KMPlayer,Dziobas Rar Player,rarfilesource,rarfs,......) 您可以按如下方式检查压缩:
如果要提取的版本表示2.0,则存档不使用压缩。 (除非你有十年之久的rars)你可以看到总大小和打包大小将是平等的。
是否有可能使其提取 单个文件何时下载?
是。当不使用压缩时,您可以编写自己的程序来解压缩文件。 (我知道有人编写了一个脚本来直接从外部rar文件下载电影;但它不公开,我也没有。)因为你提到了Python,我建议你看一下Marko的rarfile 2.2 Kreen就像pyarrfs的作者那样。存档只是添加了标题(rar块)的文件。这将是一个复制操作,您需要暂停,直到下载下一个存档。
我坚信压缩文件也是可能的。此处的方法将有所不同,因为您必须使用 unrar 来提取压缩文件。我必须补充说,还有a free RARv3 implementation来提取在Unarchiver中实现的rars。
我认为(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是在启用'solid'选项的情况下创建的,那么这将不起作用。
当固件选项用于rars时,所有打包文件都被视为one big file stream。如果始终从第一个文件开始,即使它不包含要提取的文件,也不会导致任何问题。 我也认为它适用于密码档案。
答案 1 :(得分:1)
我非常怀疑。根据压缩的性质(根据我的理解),需要每一位来解压缩它。似乎你从哪里下载的源头在压缩之前故意将avi分解成碎片,但是当你应用压缩时,无论你压缩什么,现在都是一个原子单位。因此,他们将整个avi分解为零件,但每个零件仍然是一个原子尼特。
但我不是压缩专家。
我目前唯一能想到的测试是:curl http://example.com/Part01 | unrar
。
答案 2 :(得分:0)
我不知道是否会考虑使用特定语言,但可以直接从互联网流式传输压缩的RAR,并在运行时对其进行解压缩。我可以使用我的C#库http://sharpcompress.codeplex.com/
执行此操作RAR格式实际上很不错。它在每个条目前面都有标题,压缩数据本身不需要对字节流进行随机访问。
执行多部分文件,您必须先完全提取第1部分,然后在第2部分可用时继续编写。
使用我的RarReader API可以实现所有这一切。固态存档也是可流式的(实际上,它们只是可流式传输。您不能随机访问固态存档中的文件。您几乎必须一次性提取它们。)