Java:如何为多个文件或目录创建种子文件?

Posted

技术标签:

【中文标题】Java:如何为多个文件或目录创建种子文件?【英文标题】:Java: How to create torrent file for multiple files or directories? 【发布时间】:2011-04-11 22:49:36 【问题描述】:

下面的代码是 jBitTorrent API for Java 的一部分,我稍作修改:

            if (!torr.saveAs.matches(""))
                info.put("name", torr.saveAs);
            else
                info.put("name", "noDirSpec");
            ArrayList files = new ArrayList();
            for (int i = 0; i < torr.name.size(); i++) 
                SortedMap file = new TreeMap();
                file.put("length", (Integer) torr.length.get(i));
//                String[] path = ((String) torr.name.get(i)).split("\\");
                String[] path = ((String) torr.name.get(i)).split("/");
                File f = new File((String)(torr.name.get(i)));
                ArrayList pathList = new ArrayList(path.length);

            if(f.isFile())
            
                pathList.add(path[path.length - 1]);
            
            else if(f.isDirectory())
            

// ??? 这是 torrent 文件的生成。因此,«String[] path» 被注释,因为 «\\» 不匹配 linux 斜杠并生成无效路径。多个文件的规范是:

对于多文件模式的情况,信息字典包含以下结构: name:存储所有文件的目录的文件名。这纯粹是建议性的。 (细绳) files:字典列表,每个文件一个。此列表中的每个字典都包含以下键: 长度:文件的长度,以字节为单位(整数) md5sum:(可选)一个 32 字符的十六进制字符串,对应于文件的 MD5 和。 BitTorrent 根本不使用它,但某些程序包含它以提高兼容性。 路径:包含一个或多个字符串元素的列表,这些元素共同表示路径和文件名。列表中的每个元素对应于一个目录名或(在最后一个元素的情况下)文件名。例如,文件“dir1/dir2/file.ext”将包含三个字符串元素:“dir1”、“dir2”和“file.ext”。这被编码为字符串的编码列表,例如 l4:dir14:dir28:file.exte

对于单个文件是:

对于单文件模式,信息字典包含以下结构: 名称:文件名。这纯粹是建议性的。 (细绳) 长度:文件的长度,以字节为单位(整数) md5sum:(可选)一个 32 字符的十六进制字符串,对应于文件的 MD5 和。 BitTorrent 根本不使用它,但某些程序包含它以提高兼容性。

因此,如果我将以前的代码用于单个文件,这里将生成这个 torrent:

种子文件包含:

d8:announce0:10:created by18:jBittorrentAPI 1.04:infod6:lengthi1645522e4:name27:ppkBB3cker-free-20101212.7z12:piece lengthi102400e6:pieces340:(ѕн‘xІZUЙ ЃКХЪйкжѕЫ››3УМ‹ЁWпЖћA‡ ѕ,т C;НлАтжѓњЧ0x‡Е %РъEЬ™сЖ®6ЦоёSЌ1пж`.бй%»†Ґ0VЩ%“ѕђoђџ'hО7ЦЦЭjЏВ\!R ЎЉSЖЕ|„1D”кCРк+бћJLХmЛF`Ы"ГљSЪv$Л Оuњi€ЙxQee

好的。但是我应该如何为目录生成种子?问题是在未修改的 API 中将生成具有来自根目录的完整路径的文件。但我需要这样的东西: 有效的 torrent 文件是:

d10:created by25:Transmission/2.05 (11488)13:creation datei1302559094e8:encoding5:UTF-84:infod5:filesld6:lengthi196126e4:pathl29:1231190375_bulldozer.jar.parteed6:lengthi937518e4:pathl13-rpl-40:Lfi13-rpl-40:2000-2RP 2009(eng).jar.parteed6:lengthi802555e4:pathl13:FIFA_2009-RPL31:fifa-09-rpl_176x220_en.jar.parteed6:lengthi985098e4:pathl13:FIFA_2009-RPL36:FIFA_2009-RPL_240x3620_(rus).jar.parte4:41:3854.jar.parte GAZilaMarshrutkaUbiyca [game-torrent.info] 41:GAZila_Marshrutka_Ubiyca_176x208.jar.parteed6:lengthi175851e4:pathl41:GAZilaMarshrutkaUbiyca [game-torrent.info] 41:GAZila_Marshrutka_Ubiyca_240x320.jar.parteed6:lengthi827473e4:pathl33:战争3D(240х320)的.jar的神。 parteed6:lengthi295164e4:pathl26:Men_In_Black-Alien_Assault39:Men_In_Black-Alien_Assault_176.jar.parteed6:lengthi374046e4:pathl26:Men_In_Black-Alien_Assault39:Men_In_Black-Alien_Assault_240.jar.parteee4:name53:5отличныхигрдлямобильника12:件lengthi32768e6:pieces2900:DSI %|Q�§I�I��oQ�CI�a1R�0��

【问题讨论】:

【参考方案1】:

我建议您使用System.getProperty("file.separator") 在所有操作系统上创建有效路径,而不是将其硬编码到 Windows 文件分隔符 (\)

我没用过这个API,但是看看下面这行..

对于多文件模式的情况, 信息字典包含 以下结构:名称:the 要在其中的目录的文件名 存储所有文件。

我猜你可以使用

pathList.add(path[path.length - 1]);

无论 File 对象是文件还是目录。

【讨论】:

以上是关于Java:如何为多个文件或目录创建种子文件?的主要内容,如果未能解决你的问题,请参考以下文章

无法创建种子的信息哈希

如何从磁力链接或 infohash 创建种子文件

如何为传输守护进程更改添加的 torrent 文件位置

Rails 在幂等种子文件中查找或创建 - 不通过验证

Laravel将变量从一个种子文件传递到另一个?

种子搜索是啥