
挑战:
有一台没有Internet的PC,但是可以通过USB传输文件。 有一个带有互联网的平板电脑,可以从中传输该文件。 在平板电脑上,您可以下载所需的种子,但没有足够的可用空间。 torrent中的文件很大。
解决方法:
我开始下载种子文件。 可用空间快要用完时,我暂停了下载。 我将平板电脑连接到PC,并将文件从平板电脑移动到PC。 他停顿了一下,令我惊讶的是,该文件又被创建了,种子文件继续摆动,好像什么都没发生。
由于torrent客户端将稀疏标志设置为写入接收数据的文件的事实,因此系统不会立即尝试保留16GB的空间,并且尝试写入4GB以上的文件时也不会出现错误。
重复此过程四次,我在PC上收到了四个文件,其中相同种子的不同部分都存在。 现在仍然可以将它们组装在一起。 程序本质上很简单。 如果四个文件之一中的该位置位于零位置,则必须用另一个值替换零字节。
在我看来,这样一个简单的程序应该在Internet上。 真的没有人面对这样的任务吗? 但是我意识到,我什至不知道该寻找什么关键字。 因此,我很快为此任务添加了一个Lua脚本,现在我对其进行了优化。 我要分享。
部分下载torrent
- 开始在第一台设备上下载种子
- 等到ROM填满
- 暂停下载
- 将文件传输到第二个设备,并在文件名中添加一个数字
- 返回第一点,直到文件完全下载
将零件合并到一个文件中
收到最后一部分后,有必要将它们收集到一个完整的文件中。
任务很简单:
- 一次阅读所有部分
- 如果在该位置的某个部分将非零字节写入输出,否则我们将零写入
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
string.gsub
函数适用于该任务,因为它将找到填充有零的片段并放入传递给它的内容。
string.gsub
不会传递找到匹配项的位置。 因此,我们使用string.find
函数对位置zero_string
进行并行搜索。 找到第一个零字节就足够了。
现在,如果in_part
具有in_part
数据, out_part
复制。
我们从in_part
切出与零序列相对应的部分。
有part
数据。
part
结果小于零序列。 我们用它们补充它。
结论
因此,可以在PC上下载并汇编该文件。 合并后,我从平板电脑上提取了一个种子文件。 我在PC上安装了torrent客户端,并检查了文件。
平板电脑上最后下载的零件可以保留在发行版中,但是您需要在此之前打开零件的重复检查,然后取消选中文件,以免再次下载。
二手货:
- 洪流客户端Flud在平板电脑上。
- PC上的QBittorent torrent客户端。
- Lua脚本