Download vun engem 16GB Torrent iwwer eng Tablet mat 4GB fräi Plaz
Eng Aufgab:
Et gëtt e PC ouni Internet, awer et ass méiglech d'Datei iwwer USB ze transferéieren. Et gëtt en Tablet mam Internet vun deem dës Datei iwwerdroe ka ginn. Dir kënnt den erfuerderlechen Torrent op Ärem Tablet eroflueden, awer et ass net genuch fräi Plaz. D'Datei am Torrent ass eng a grouss.
Wee zur Léisung:
Ech hunn den Torrent ugefaang fir erofzelueden. Wann de fräie Raum bal fort war, hunn ech den Download gestoppt. Ech hunn den Tablet mam PC verbonnen an d'Datei vum Tablet op de PC geplënnert. Ech hunn gestoppt an zu menger Iwwerraschung gouf d'Datei erëm erstallt an den Torrent huet weider erofgelueden wéi wann näischt geschitt wier.
Wéinst der Tatsaach, datt de Torrent Client de sparse Fändel op d'Datei setzt, an där se déi kritt Donnéeën schreift, probéiert de System net 16GB gläichzäiteg ze reservéieren an e Feeler wäert net optrieden wann Dir probéiert op eng Datei iwwer 4GB ze schreiwen.
Nodeems ech d'Prozedur véier Mol widderholl hunn, krut ech véier Dateien op mengem PC mat verschiddenen Deeler vum selwechte Torrent. Elo bleift et just fir se zesummen ze setzen. D'Prozedur ass wesentlech einfach. Dir musst d'Nullbytes mat engem anere Wäert ersetzen, wann et op enger bestëmmter Positioun an enger vun de véier Dateien existéiert.
Et huet mir geschéngt datt sou en einfache Programm um Internet sollt sinn. Huet nach keen esou e Problem begéint? Awer ech hu gemierkt datt ech net emol weess wéi eng Schlësselwierder fir no ze sichen. Dofir hunn ech séier e Lua Skript fir dës Aufgab erstallt an elo hunn ech et optimiséiert. Dëst ass wat ech wëll deelen.
Den Torrent an Deeler eroflueden
Start den Torrent op den éischten Apparat erofzelueden
waart bis d'ROM gefëllt ass
Paus den Download
Transfert d'Datei op den zweeten Apparat a füügt eng Nummer un de Dateinumm
mir zréck op den éischte Punkt bis de Fichier komplett erofgeluede ass
Fusioun Deeler an eng Datei
Nodeems de leschten Deel kritt ass, ass et néideg se an eng ganz Datei ze sammelen.
D'Aufgab ass einfach:
Liest all Deeler op eemol
Wann an engem Deel d'Positioun net en Nullbyte ass, da schreiwen mir et op d'Ausgab, soss schreiwen mir Null
Funktioun merge_part akzeptéiert eng Rei vun thread streams_in vun deem liest eng Portioun Gréisst buffer_length a gëtt d'Resultat vun der Fusioun vun Deeler aus verschiddene Threads zré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("[^ ]") -- есть данные в in_part
and out_part:find(" ", 1, true) -- есть пустые места в out_part
then
local find_index = 1
--[[
Funktioun string.gsub ass gëeegent fir d'Aufgab, well et Stécker gefëllt mat Nullen fannen a liwweren wat et gëtt.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub vermëttelt net d'Positioun op där de Match fonnt gouf. Dofir maache mir eng parallel Sich no der Positioun zero_string benotzt d'Funktioun string.find. Et ass genuch fir den éischten Nullbyte ze fannen.
Elo wann an in_part et gëtt daten fir out_part kopéieren hinnen.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Aus schneiden in_part Deel entspriechend der Sequenz vun Nullen.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part et gëtt daten.
--]]
if #part == #zero_string then
return part
else
--[[
part huet sech manner wéi eng Sequenz vun Nullen erausgestallt. Loosst eis et mat hinnen ergänzen.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
Konklusioun
Sou konnte mir dës Datei op engem PC eroflueden an zesummestellen. No der Fusioun hunn ech d'Torrentdatei vum Tablet erausgezunn. Ech hunn en Torrent Client op mengem PC installéiert an d'Datei domat iwwerpréift.
De leschten erofgelueden Deel op der Tablet kann op der Verdeelung hannerlooss ginn, awer Dir musst d'Wiederiwwerpréiwung vun den Deeler virun dësem aktivéieren an d'Datei auschecken fir datt se net erëm erofluet.