如果torrent包含多个文件,如何知道每个文件对应哪个文件?

时间:2018-03-20 21:01:54

标签: bittorrent

我正在用Java构建一个BitTorrent客户端应用程序,我有两个小问题:

  1. torrent可以包含文件夹吗?递归?
  2. 如果torrent包含n个文件(不是目录 - 为简单起见),我是否需要创建具有相应大小的n个文件?当我从同伴收到一件作品时,我怎么知道它(该作品)属于哪个档案?
  3. 例如,这是一个包含2个文件的torrent:

    TorrentInfo{Created By: ruTorrent (PHP Class - Adrien Gibrat)
    Main tracker: http://tracker.hebits.net:35777/tracker.php?do=announce&passkey=5d3ab309eda55c1e7183975099958ab2
    Comment: null
    Info_hash: c504216ca4a113d26f023a10a1249ca3a6217997
    Name: Veronica.2017.1080p.BluRay.DTS-HD.MA.5.1.x264-HDH
    Piece Length: 16777216
    Pieces: 787
    Total Size: null
    Is Single File Torrent: false
    File List:
    TorrentFile{fileLength=13202048630, fileDirs=[Veronica.2017.1080p.BluRay.DTS-HD.MA.5.1.x264-HDH.mkv]}
    TorrentFile{fileLength=62543, fileDirs=[Veronica.2017.1080p.BluRay.DTS-HD.MA.5.1.x264-HDH.srt]}
    

    文档并没有多说:https://wiki.theory.org/index.php/BitTorrentSpecification

2 个答案:

答案 0 :(得分:2)

你在做什么与我的相似...

以下粗体字对您的问题很重要。

1.是;无

多文件模式下的信息

名称:用于存储所有文件的目录的名称。这纯粹是建议性的。 (字符串)

路径:包含一个或多个字符串元素的列表,这些字符串元素一起表示路径和文件名。列表中的每个元素对应于目录名称或(在最终元素的情况下)文件名。例如,文件“dir1 / dir2 / file.ext”将包含三个字符串元素:“dir1”,“dir2”和“file.ext”。这被编码为字符串的字符串列表,例如l4:* dir * 14:* dir * 28:file.exte

单一文件模式下的信息

名称:文件名。这纯粹是建议性的。 (字符串)

文件名包含floder名称。

2.maybe;

是否需要创建具有相应大小的n个文件取决于您是否需要下载n个文件。

对等线协议(TCP)

piece

片段消息是可变长度,其中X是块的长度。有效负载包含以下信息:

index:指定从零开始的片段索引的整数

开始:整数,指定片段中基于零的字节偏移量

block:数据块,它是索引指定的块的子集。

对于多文件大小写中的片段边界,请将文件数据视为一个长连续流,由每个文件的串联组成文件列表中列出的顺序。然后以与单个文件的情况相同的方式确定片段数量及其边界。碎片可能会重叠文件边界。

我很抱歉我的英语,因为我不是母语人士......

答案 1 :(得分:1)

  

torrent可以包含文件夹吗?递归?

是。
有点。在BEP3中,嵌套目录被映射到路径元素,即/dir1/dir2/dir3/file.ext在文件列表中表示为路径:["dir1", "dir2", "dir3", "file.ext"]。 BEP52将其更改为更接近目录树的基于树的结构。

  

如果torrent包含n个文件(不是目录 - 为简单起见),我是否需要创建具有相应大小的n个文件?当我从同伴那里收到一件作品时,我怎么知道它(作品)属于哪个档案?

bittorrent线协议处理连续的字节地址空间,这些地址空间被分组为固定大小的块。客户端如何在本地存储这些字节原则上取决于实现。但是如果你想将它存储在.torrent中描述的文件布局中,那么你必须计算碎片地址空间和文件偏移之间的映射。在BEP3中,文件未与片段边界对齐,因此单个片段可以跨越多个文件。 BEP 47和BEP 52旨在通过分别引入填充文件或隐式对齐间隙来简化这一过程。