
Desafio:
Há um PC sem a Internet, mas é possível transferir o arquivo via USB. Há um tablet com a Internet a partir do qual esse arquivo pode ser transferido. No tablet, você pode baixar o torrent desejado, mas não há espaço livre suficiente. O arquivo no torrent é único e grande.
Caminho para a solução:
Comecei o torrent para baixar. Quando o espaço livre quase chegou ao fim, pausei o download. Conectei o tablet ao PC e movi o arquivo do tablet para o PC. Ele parou e, para minha surpresa, o arquivo foi criado novamente e o torrent continuou a balançar ainda mais como se nada tivesse acontecido.
Devido ao fato de o cliente torrent definir o sinalizador esparso para um arquivo no qual grava os dados recebidos, o sistema não tenta reservar imediatamente 16 GB e não haverá erro ao tentar gravar em um arquivo além de 4 GB.
Repetindo o procedimento quatro vezes, recebi quatro arquivos no PC em que partes diferentes do mesmo torrent. Agora resta montá-los juntos. O procedimento é essencialmente simples. É necessário substituir zero bytes por outro valor se ele estiver nessa posição em um dos quatro arquivos.
Pareceu-me que um programa tão simples deveria estar na Internet. Realmente ninguém enfrentou essa tarefa? Mas percebi que nem sabia quais palavras-chave procurar por ela. Portanto, joguei rapidamente um script Lua para esta tarefa e agora o otimizei. Eu quero compartilhar
Download torrent em partes
- comece a baixar torrent no primeiro dispositivo
- aguarde até a ROM estar cheia
- pausar o download
- transfira o arquivo para o segundo dispositivo e adicione um dígito ao nome do arquivo
- volte ao primeiro ponto até que o arquivo seja baixado completamente
Mesclar peças em um arquivo
Depois que a última parte é recebida, é necessário coletá-las em um arquivo inteiro.
A tarefa é simples:
- Leia todas as peças de uma só vez
- Se em alguma parte da posição o byte diferente de zero for gravado na saída, caso contrário, escreveremos zero
A função merge_part
pega uma matriz de streams_in
fluxos a partir da qual lê uma parte do tamanho buffer_length
e retorna o resultado da mesclagem de partes de diferentes fluxos.
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
A função string.gsub
adequada para a tarefa, pois encontra peças preenchidas com zeros e coloca o que é passado para ela.
string.gsub
não passa na posição em que uma correspondência foi encontrada. Portanto, fazemos uma pesquisa paralela para a posição zero_string
usando a função string.find
. Basta encontrar o primeiro byte zero.
Agora, se in_part
tiver dados para out_part
copie-os.
in_part
a parte correspondente à sequência de zeros de in_part
.
Existem dados em part
.
part
acabou sendo menor que uma sequência de zeros. Nós complementamos com eles.
Conclusão
Assim, foi possível baixar e montar esse arquivo em um PC. Após a fusão, peguei um arquivo torrent do tablet. Instalei o cliente de torrent no PC e verifiquei o arquivo com ele.
A última parte baixada no tablet pode ser deixada na distribuição, mas você precisa ativar a verificação repetida das peças antes disso e desmarcar o arquivo para que ele não faça o download novamente.
Usado:
- Cliente de torrent Flud no tablet.
- Cliente de torrent QBittorent no PC.
- Script Lua