
Desafío:
Hay una PC sin Internet, pero es posible transferir el archivo a través de USB. Hay una tableta con Internet desde la cual se puede transferir este archivo. En la tableta puedes descargar el torrent deseado pero no hay suficiente espacio libre. El archivo en el torrent es único y grande.
Camino a la solución:
Empecé el torrent para descargar. Cuando el espacio libre casi llegó a su fin, detuve la descarga. Conecté la tableta a la PC y moví el archivo de la tableta a la PC. Hizo una pausa y, para mi sorpresa, el archivo se creó de nuevo y el torrente continuó oscilando aún más como si nada hubiera pasado.
Debido al hecho de que el cliente torrent establece el indicador disperso en un archivo en el que escribe los datos recibidos, el sistema no intenta reservar inmediatamente 16 GB y no habrá ningún error al intentar escribir en un archivo más allá de 4 GB.
Repitiendo el procedimiento cuatro veces, recibí cuatro archivos en la PC en los que diferentes partes del mismo torrente. Ahora queda reunirlos. El procedimiento es esencialmente simple. Es necesario reemplazar cero bytes con otro valor si está en esta posición en uno de los cuatro archivos.
Me pareció que un programa tan simple debería estar en Internet. ¿Realmente nadie enfrentó tal tarea? Pero me di cuenta de que ni siquiera sé qué palabras clave buscarla. Por lo tanto, rápidamente lancé un script Lua para esta tarea y ahora lo he optimizado. Quiero compartirlo
Descargar torrent en partes
- comenzar a descargar torrent en el primer dispositivo
- espere hasta que se llene la ROM
- pausa la descarga
- transfiera el archivo al segundo dispositivo y agregue un dígito al nombre del archivo
- regrese al primer punto hasta que el archivo se descargue completamente
Combinar partes en un archivo
Después de recibir la última parte, es necesario recopilarlos en un archivo completo.
La tarea es simple:
- Lee todas las partes a la vez
- Si en alguna parte en la posición el byte distinto de cero se escribe en la salida, de lo contrario, escribimos cero
La función merge_part
toma una matriz de streams_in
streams de la que lee una parte del tamaño buffer_length
y devuelve el resultado de fusionar partes de diferentes streams.
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
La función string.gsub
adecuada para la tarea, ya que encontrará piezas llenas de ceros y pondrá lo que se le pasa.
string.gsub
no pasa la posición en la que se encontró una coincidencia. Por lo tanto, hacemos una búsqueda paralela de la posición zero_string
usando la función string.find
. Es suficiente para encontrar el primer byte cero.
Ahora, si in_part
tiene datos para out_part
cópielo.
Cortamos la parte correspondiente a la secuencia de ceros de in_part
.
Hay datos en part
.
part
resultó ser menos que una secuencia de ceros. Lo complementamos con ellos.
Conclusión
Por lo tanto, fue posible descargar y ensamblar este archivo en una PC. Después de la fusión, saqué un archivo torrent de la tableta. Instalé el cliente torrent en la PC y verifiqué el archivo con él.
La última parte descargada en la tableta se puede dejar en la distribución, pero debe activar la verificación repetida de las partes antes de esto y desmarcar el archivo para que no se descargue nuevamente.
Utilizado:
- Cliente Torrent Flud en la tableta.
- QBittorent torrent client en PC.
- Lua script