
Herausforderung:
Es gibt einen PC ohne Internet, aber es ist möglich, die Datei über USB zu übertragen. Es gibt ein Tablet mit dem Internet, von dem diese Datei übertragen werden kann. Auf dem Tablet können Sie den gewünschten Torrent herunterladen, aber nicht genügend freien Speicherplatz. Die Datei im Torrent ist einfach und groß.
Weg zur Lösung:
Ich habe den Torrent zum Herunterladen gestartet. Als der freie Speicherplatz fast zu Ende war, pausierte ich den Download. Ich habe das Tablet an den PC angeschlossen und die Datei vom Tablet auf den PC verschoben. Er machte eine Pause und zu meiner Überraschung wurde die Datei erneut erstellt und der Strom schwang weiter, als wäre nichts passiert.
Aufgrund der Tatsache, dass der Torrent-Client das Sparse-Flag auf eine Datei setzt, in die er die empfangenen Daten schreibt, versucht das System nicht sofort, 16 GB zu reservieren, und es tritt kein Fehler auf, wenn versucht wird, in eine Datei über 4 GB hinaus zu schreiben.
Ich wiederholte den Vorgang viermal und erhielt vier Dateien auf dem PC, in denen sich verschiedene Teile desselben Torrents befanden. Jetzt bleibt es, sie zusammenzubauen. Das Verfahren ist im Wesentlichen einfach. Es ist notwendig, null Bytes durch einen anderen Wert zu ersetzen, wenn es sich in einer der vier Dateien an dieser Position befindet.
Es schien mir, dass ein so einfaches Programm im Internet sein sollte. Wirklich niemand stand vor einer solchen Aufgabe? Aber mir wurde klar, dass ich nicht einmal weiß, nach welchen Keywords ich suchen soll. Deshalb habe ich schnell ein Lua-Skript für diese Aufgabe erstellt und jetzt habe ich es optimiert. Ich möchte es teilen.
Torrent in Teilen herunterladen
- Starten Sie den Download von Torrent auf dem ersten Gerät
- Warten Sie, bis das ROM gefüllt ist
- Unterbrechen Sie den Download
- Übertragen Sie die Datei auf das zweite Gerät und fügen Sie dem Dateinamen eine Ziffer hinzu
- Gehen Sie zurück zum ersten Punkt, bis die Datei vollständig heruntergeladen ist
Teile in einer Datei zusammenführen
Nachdem der letzte Teil empfangen wurde, müssen sie in einer ganzen Datei zusammengefasst werden.
Die Aufgabe ist einfach:
- Lesen Sie alle Teile auf einmal
- Wenn in einem Teil der Position das Nicht-Null-Byte in den Ausgang geschrieben wird, schreiben wir andernfalls Null
Die Funktion merge_part
verwendet ein Array von streams_in
Streams, aus denen ein Teil der Größe buffer_length
und gibt das Ergebnis des Zusammenführens von Teilen aus verschiedenen Streams zurück.
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
Die Funktion string.gsub
für die Aufgabe geeignet, da sie mit Nullen gefüllte Teile findet und das, was an sie übergeben wird, string.gsub
.
string.gsub
nicht die Position, an der eine Übereinstimmung gefunden wurde. Daher führen wir eine parallele Suche nach der Position zero_string
mit der Funktion string.find
. Es reicht aus, das erste Null-Byte zu finden.
Wenn in_part
Daten für out_part
kopieren Sie diese.
Wir schneiden den Teil, der der Folge von Nullen entspricht, aus in_part
.
Es gibt teilweise Daten.
part
stellte sich als weniger als eine Folge von Nullen heraus. Wir ergänzen es mit ihnen.
Fazit
Somit war es möglich, diese Datei auf einen PC herunterzuladen und zusammenzustellen. Nach der Fusion habe ich eine Torrent-Datei vom Tablet gezogen. Ich habe den Torrent-Client auf dem PC installiert und die Datei damit überprüft.
Der zuletzt heruntergeladene Teil auf dem Tablet kann in der Distribution verbleiben. Sie müssen ihn jedoch vor dem erneuten Überprüfen der Teile einschließen und die Datei deaktivieren, damit sie nicht erneut heruntergeladen wird.
Gebraucht:
- Torrent Client Flud auf dem Tablet.
- QBittorent Torrent Client auf dem PC.
- Lua-Skript