16 GB torrent atsisiuntimas per planšetinį kompiuterį su 4 GB laisvos vietos
Užduotis:
Yra kompiuteris be interneto, bet galima per USB perkelti failą. Yra planšetė su internetu, iš kurios galima perkelti šį failą. Galite atsisiųsti reikiamą torrentą į savo planšetinį kompiuterį, tačiau nėra pakankamai laisvos vietos. Torrent failas yra vienas ir didelis.
Kelias į sprendimą:
Pradėjau atsisiųsti torrentą. Kai laisvos vietos beveik nebeliko, pristabdžiau atsisiuntimą. Prijungiau planšetinį kompiuterį prie kompiuterio ir perkėliau failą iš planšetinio kompiuterio į kompiuterį. Sustabdžiau ir, mano nuostabai, failas vėl buvo sukurtas, o torrento atsisiuntimas tęsėsi taip, lyg nieko nebūtų nutikę.
Dėl to, kad torrent klientas nustato retąją vėliavėlę prie failo, kuriame rašo gautus duomenis, sistema nebando rezervuoti 16 GB iš karto ir klaida neatsiras bandant įrašyti į didesnį nei 4 GB failą.
Pakartojęs procedūrą keturis kartus, į savo kompiuterį gavau keturis failus, kuriuose yra skirtingos to paties torrento dalys. Dabar belieka juos sujungti. Procedūra iš esmės paprasta. Nulinius baitus turite pakeisti kita reikšme, jei ji yra nurodytoje vieno iš keturių failų pozicijoje.
Man atrodė, kad tokia paprasta programa turėtų būti internete. Ar niekas niekada nesusidūrė su tokia problema? Bet supratau, kad net nežinau, kokiais raktiniais žodžiais to ieškoti. Todėl greitai sukūriau Lua scenarijų šiai užduočiai ir dabar jį optimizavau. Tuo noriu pasidalinti.
Torrent parsisiųsti dalimis
pradėkite atsisiųsti torrent iš pirmojo įrenginio
palaukite, kol ROM bus užpildytas
pristabdyti atsisiuntimą
perkelkite failą į antrą įrenginį ir pridėkite numerį prie failo pavadinimo
grįžtame į pirmąjį tašką, kol failas bus visiškai atsisiųstas
Dalių sujungimas į vieną failą
Gavus paskutinę dalį, reikia jas surinkti į vieną visą failą.
Užduotis paprasta:
Skaityti visas dalis vienu metu
Jei kažkurioje dalyje padėtis nėra nulinis baitas, tai įrašome į išvestį, kitu atveju rašome nulį
Funkcija merge_part priima gijų masyvą streams_in iš kurių skaitoma dydžio dalis buffer_length ir grąžina skirtingų gijų dalių sujungimo rezultatą.
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
--[[
Funkcija string.gsub tinka užduočiai, nes suras gabalus, užpildytus nuliais, ir pateiks tai, kas jai duota.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub neperteikia padėties, kurioje buvo rastas atitikmuo. Todėl lygiagrečiai atliekame pozicijos paiešką zero_string naudojant funkciją string.find. Pakanka rasti pirmąjį nulinį baitą.
Jei dabar in_part yra duomenų out_part nukopijuokite juos.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Iškirpti iš in_part dalis, atitinkanti nulių seką.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part yra duomenų.
--]]
if #part == #zero_string then
return part
else
--[[
part pasirodė esanti mažesnė už nulių seką. Papildykime jais.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
išvada
Taigi mes galėjome atsisiųsti ir surinkti šį failą kompiuteryje. Po susijungimo iš planšetinio kompiuterio ištraukiau torrent failą. Įdiegiau torrent klientą savo kompiuteryje ir patikrinau failą su juo.
Paskutinę atsisiųstą dalį planšetiniame kompiuteryje galima palikti paskirstyme, tačiau prieš tai turite įjungti dalių pakartotinį patikrinimą ir panaikinti failo žymėjimą, kad jis nebūtų vėl atsisiunčiamas.