4

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

非常感谢你!

马泰奥

4

3 回答 3

8

您说的是 rar 档案中的 .avi 文件。您确定档案实际上是压缩的吗?warez 场景发布的视频文件不使用压缩:

由于文件很大,翻录的电影仍被打包,但不允许压缩,RAR 格式仅用作容器。正因为如此,现代播放软件可以轻松地直接从打包文件中播放版本,甚至在下载版本时将其流式传输(如果网络足够快)。

(我在想 VLC、BSPlayer、KMPlayer、Dziobas Rar Player、rarfilesource、rarfs、...)您可以按如下方式检查压缩:

  • 在 WinRAR 中打开第一个 .rar 存档。(name.part01.rar 或 name.rar 用于旧式卷名
  • 单击信息按钮。

如果要提取的版本指示 2.0,则存档不使用压缩。(除非你有十年前的 rars)你可以看到总大小打包大小是相等的。

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

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

我坚信压缩文件也是可能的。您在这里的方法会有所不同,因为您必须使用unrar来提取压缩文件。我必须补充一点,还有一个免费的 RARv3 实现来提取在 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 使用solid 选项时,所有打包文件都被视为一个大文件流。如果您总是从第一个文件开始,即使它不包含您要提取的文件,这应该不会导致任何问题。我也认为它适用于密码档案。

于 2011-06-29T21:49:27.803 回答
1

我对此表示高度怀疑。根据压缩的性质(根据我的理解),解压缩它需要每一位。似乎您下载的来源故意在压缩之前将 avi 分解成碎片,但是当您应用压缩时,您压缩的任何内容现在都是一个原子单位。所以他们好心地将整个 avi 分解成 Parts,但每个 Part 仍然是一个原子 nit。

但我不是压缩专家。

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

于 2011-06-29T14:30:47.857 回答
0

我不知道这是否是在考虑特定语言的情况下提出的,但是可以直接从 Internet 流式传输压缩的 RAR 并即时解压缩。我可以用我的 C# 库http://sharpcompress.codeplex.com/做到这一点

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

做多部分文件,您必须先完全提取第 1 部分,然后在第 2 部分可用时继续编写。

这一切都可以通过我的 RarReader API 实现。实体存档也是可流式传输的(实际上,它们只是可流式传输的。您不能随机访问实体存档中的文件。您几乎必须一次提取所有文件。)

于 2012-03-16T09:38:28.507 回答