
Défi:
Il y a un PC sans Internet mais il est possible de transférer le fichier via USB. Il existe une tablette avec Internet à partir de laquelle ce fichier peut être transféré. Sur la tablette, vous pouvez télécharger le torrent souhaité mais pas assez d'espace libre. Le fichier dans le torrent est unique et volumineux.
Chemin vers la solution:
J'ai commencé le torrent à télécharger. Lorsque l'espace libre a presque pris fin, j'ai interrompu le téléchargement. J'ai connecté la tablette au PC et déplacé le fichier de la tablette vers le PC. Il marqua une pause et, à ma grande surprise, le fichier fut de nouveau créé et le torrent continua de se balancer plus loin comme si de rien n'était.
Étant donné que le client torrent définit l'indicateur clairsemé dans un fichier dans lequel il écrit les données reçues, le système n'essaie pas immédiatement de réserver 16 Go et il n'y aura aucune erreur lors de la tentative d'écriture dans un fichier au-delà de 4 Go.
Répétant la procédure quatre fois, j'ai reçu quatre fichiers sur le PC dans lesquels différentes parties du même torrent. Reste maintenant à les assembler. La procédure est essentiellement simple. Il est nécessaire de remplacer zéro octet par une autre valeur s'il se trouve à cette position dans l'un des quatre fichiers.
Il me semblait qu'un programme aussi simple devrait être sur Internet. Vraiment personne n'a fait face à une telle tâche? Mais j'ai réalisé que je ne savais même pas quels mots clés rechercher. Par conséquent, j'ai rapidement lancé un script Lua pour cette tâche et maintenant je l'ai optimisé. Je veux le partager.
Télécharger torrent en plusieurs parties
- commencer à télécharger torrent sur le premier appareil
- attendez que la ROM soit remplie
- interrompre le téléchargement
- transférer le fichier vers le deuxième appareil et ajouter un chiffre au nom du fichier
- revenir au premier point jusqu'à ce que le fichier soit complètement téléchargé
Fusionner des pièces en un seul fichier
Une fois la dernière partie reçue, il est nécessaire de les rassembler dans un fichier entier.
La tâche est simple:
- Lisez toutes les pièces en même temps
- Si dans une partie de la position, l'octet non nul est écrit dans la sortie, sinon nous écrivons zéro
La fonction merge_part
prend un tableau de flux streams_in
partir duquel elle lit une partie de la taille buffer_length
et renvoie le résultat de la fusion de parties de différents flux.
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 fonction string.gsub
convient à la tâche car elle trouvera des morceaux remplis de zéros et mettra ce qui lui est transmis.
string.gsub
ne passe pas la position à laquelle une correspondance a été trouvée. Par conséquent, nous faisons une recherche parallèle pour la position zero_string
utilisant la fonction string.find
. Il suffit de trouver le premier octet zéro.
Maintenant, si in_part
a des données pour out_part
copiez-les.
Nous in_part
la partie correspondant à la séquence de zéros de in_part
.
Il y a des données en part
.
part
s'est avérée inférieure à une séquence de zéros. Nous le complétons avec eux.
Conclusion
Ainsi, il a été possible de télécharger et d'assembler ce fichier sur un PC. Après la fusion, j'ai sorti un fichier torrent de la tablette. J'ai installé le client torrent sur le PC et vérifié le fichier avec.
La dernière partie téléchargée sur la tablette peut être laissée sur la distribution, mais vous devez activer la vérification répétée des parties avant cela et décocher le fichier afin qu'il ne se télécharge plus.
Utilisé:
- Client Torrent Flud sur la tablette.
- Client torrent QBittorent sur PC.
- Script Lua