通过平板电脑下载16GB种子,拥有4GB可用空间


挑战:


有一台没有Internet的PC,但是可以通过USB传输文件。 有一个带有互联网的平板电脑,可以从中传输该文件。 在平板电脑上,您可以下载所需的种子,但没有足够的可用空间。 torrent中的文件很大。


解决方法:


我开始下载种子文件。 可用空间快要用完时,我暂停了下载。 我将平板电脑连接到PC,并将文件从平板电脑移动到PC。 他停顿了一下,令我惊讶的是,该文件又被创建了,种子文件继续摆动,好像什么都没发生。


由于torrent客户端将稀疏标志设置为写入接收数据的文件的事实,因此系统不会立即尝试保留16GB的空间,并且尝试写入4GB以上的文件时也不会出现错误。


重复此过程四次,我在PC上收到了四个文件,其中相同种子的不同部分都存在。 现在仍然可以将它们组装在一起。 程序本质上很简单。 如果四个文件之一中的该位置位于零位置,则必须用另一个值替换零字节。


在我看来,这样一个简单的程序应该在Internet上。 真的没有人面对这样的任务吗? 但是我意识到,我什至不知道该寻找什么关键字。 因此,我很快为此任务添加了一个Lua脚本,现在我对其进行了优化。 我要分享。


部分下载torrent


  1. 开始在第一台设备上下载种子
  2. 等到ROM填满
  3. 暂停下载
  4. 将文件传输到第二个设备,并在文件名中添加一个数字
  5. 返回第一点,直到文件完全下载

将零件合并到一个文件中


收到最后一部分后,有必要将它们收集到一个完整的文件中。


任务很简单:


  1. 一次阅读所有部分
  2. 如果在该位置的某个部分将非零字节写入输出,否则我们将零写入

merge_part函数采用streams_in流的数组, streams_in读取大小为buffer_length的一部分,并返回合并来自不同流的部分的结果。


 function merge_part(streams_in, buffer_length) local out_part for _, stream in ipairs(streams_in) do local in_part = stream:read(buffer_length) if not out_part then out_part = in_part --       elseif in_part and #in_part > 0 then if #out_part < #in_part then out_part, in_part = in_part, out_part end if out_part ~= in_part --   and in_part:find("[^\0]") --    in_part and out_part:find("\0", 1, true) --     out_part then local find_index = 1 --[[ 

string.gsub函数适用于该任务,因为它将找到填充有零的片段并放入传递给它的内容。


 --]] out_part = out_part:gsub("\0+", function(zero_string) if #in_part < find_index then return --     end --[[ 

string.gsub不会传递找到匹配项的位置。 因此,我们使用string.find函数对位置zero_string进行并行搜索。 找到第一个零字节就足够了。


 --]] local start_index = out_part:find("\0", find_index, true) find_index = start_index + #zero_string --[[ 

现在,如果in_part具有in_part数据, out_part复制。


 --]] if #in_part >= start_index then local end_index = start_index + #zero_string - 1 --[[ 

我们从in_part切出与零序列相对应的部分。


 --]] local part = in_part:sub(start_index, end_index) if (part:byte(1) ~= 0) or part:find("[^\0]") then --[[ 

part数据。


 --]] if #part == #zero_string then return part else --[[ 

part结果小于零序列。 我们用它们补充它。


 --]] return part..zero_string:sub(1, end_index - #in_part) end end end end) end end end return out_part end 

结论


因此,可以在PC上下载并汇编该文件。 合并后,我从平板电脑上提取了一个种子文件。 我在PC上安装了torrent客户端,并检查了文件。


平板电脑上最后下载的零件可以保留在发行版中,但是您需要在此之前打开零件的重复检查,然后取消选中文件,以免再次下载。


二手货:


  1. 洪流客户端Flud在平板电脑上。
  2. PC上的QBittorent torrent客户端。
  3. Lua脚本

Source: https://habr.com/ru/post/zh-CN473636/


All Articles