Download af en 16 GB torrent via en tablet med 4 GB ledig plads
Formål:
Der er en pc uden internet, men det er muligt at overføre filen via USB. Der er en tablet med internettet, hvorfra denne fil kan overføres. Du kan downloade den nødvendige torrent på din tablet, men der er ikke nok ledig plads. Filen i torrenten er en og stor.
Vej til løsning:
Jeg startede torrenten for at downloade. Da den ledige plads næsten var væk, satte jeg downloadingen på pause. Jeg sluttede tabletten til pc'en og flyttede filen fra tabletten til pc'en. Jeg holdt en pause, og til min overraskelse blev filen oprettet igen, og torrenten fortsatte med at downloade, som om intet var hændt.
På grund af det faktum, at torrent-klienten indstiller sparse flag til filen, hvori den skriver de modtagne data, forsøger systemet ikke at reservere 16 GB på én gang, og der vil ikke opstå en fejl, når du forsøger at skrive til en fil ud over 4 GB.
Efter at have gentaget proceduren fire gange modtog jeg fire filer på min pc, der indeholdt forskellige dele af den samme torrent. Nu er der kun tilbage at sætte dem sammen. Fremgangsmåden er grundlæggende enkel. Du skal erstatte nul bytes med en anden værdi, hvis den findes på en given position i en af de fire filer.
Det forekom mig, at et så simpelt program skulle være på internettet. Har ingen nogensinde stødt på et sådant problem? Men jeg indså, at jeg ikke engang ved, hvilke søgeord jeg skal søge efter det. Derfor lavede jeg hurtigt et Lua-script til denne opgave, og nu har jeg optimeret det. Det er det, jeg vil dele.
Download torrent i dele
begynde at downloade torrenten på den første enhed
vent til ROM'en er fyldt
pause download
overføre filen til den anden enhed og tilføje et nummer til filnavnet
vi vender tilbage til det første punkt, indtil filen er downloadet fuldstændigt
Sammenlægning af dele til én fil
Efter at den sidste del er modtaget, er det nødvendigt at samle dem i en hel fil.
Opgaven er enkel:
Læser alle dele på én gang
Hvis positionen i en eller anden del ikke er en nulbyte, så skriver vi den til outputtet, ellers skriver vi nul
Funktion merge_part accepterer en række tråde streams_in hvoraf læser en del af størrelsen buffer_length og returnerer resultatet af sammenlægning af dele fra forskellige tråde.
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
--[[
Funktion string.gsub er egnet til opgaven, fordi den vil finde brikker fyldt med nuller og levere det, der er givet til den.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub angiver ikke den position, hvor matchen blev fundet. Derfor laver vi en parallelsøgning på stillingen zero_string ved hjælp af funktionen string.find. Det er nok at finde den første nulbyte.
Nu hvis i in_part der er data for out_part kopiere dem.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Klip fra in_part del svarende til rækkefølgen af nuller.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part der er data.
--]]
if #part == #zero_string then
return part
else
--[[
part viste sig at være mindre end en sekvens af nuller. Lad os supplere det med dem.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
Konklusion
Således var vi i stand til at downloade og samle denne fil på en pc. Efter fusionen trak jeg torrent-filen ud fra tabletten. Jeg installerede en torrent-klient på min pc og tjekkede filen med den.
Den sidst downloadede del på tabletten kan efterlades på distributionen, men du skal aktivere gentjek af delene før dette og fjerne markeringen af filen, så den ikke downloades igen.