Laden Sie 16 GB Torrent über ein Tablet mit 4 GB freiem Speicherplatz herunter


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


  1. Starten Sie den Download von Torrent auf dem ersten Gerät
  2. Warten Sie, bis das ROM gefüllt ist
  3. Unterbrechen Sie den Download
  4. Übertragen Sie die Datei auf das zweite Gerät und fügen Sie dem Dateinamen eine Ziffer hinzu
  5. 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:


  1. Lesen Sie alle Teile auf einmal
  2. 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 --       elseif in_part and #in_part > 0 then if #out_part < #in_part then out_part, in_part = in_part, out_part end if out_part ~= in_part --   and in_part:find("[^\0]") --    in_part and out_part:find("\0", 1, true) --     out_part then local find_index = 1 --[[ 

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 .


 --]] out_part = out_part:gsub("\0+", function(zero_string) if #in_part < find_index then return --     end --[[ 

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.


 --]] local start_index = out_part:find("\0", find_index, true) find_index = start_index + #zero_string --[[ 

Wenn in_part Daten für out_part kopieren Sie diese.


 --]] if #in_part >= start_index then local end_index = start_index + #zero_string - 1 --[[ 

Wir schneiden den Teil, der der Folge von Nullen entspricht, aus in_part .


 --]] local part = in_part:sub(start_index, end_index) if (part:byte(1) ~= 0) or part:find("[^\0]") then --[[ 

Es gibt teilweise Daten.


 --]] if #part == #zero_string then return part else --[[ 

part stellte sich als weniger als eine Folge von Nullen heraus. Wir ergänzen es mit ihnen.


 --]] return part..zero_string:sub(1, end_index - #in_part) end end end end) end end end return out_part end 

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:


  1. Torrent Client Flud auf dem Tablet.
  2. QBittorent Torrent Client auf dem PC.
  3. Lua-Skript

Source: https://habr.com/ru/post/de473636/


All Articles