16 GB torrenti allalaadimine tahvelarvuti kaudu, millel on 4 GB vaba ruumi

16 GB torrenti allalaadimine tahvelarvuti kaudu, millel on 4 GB vaba ruumi

Ülesanne:

Arvuti on ilma Internetita, kuid faili on võimalik USB kaudu edastada. Internetiga tahvelarvuti, kust seda faili saab üle kanda. Saate oma tahvelarvutisse alla laadida vajaliku torrenti, kuid vaba ruumi pole piisavalt. Torrentis olev fail on üks ja suur.

Tee lahenduseni:

Alustasin torrenti allalaadimist. Kui vaba ruum oli peaaegu otsas, peatasin allalaadimise. Ühendasin tahvelarvuti arvutiga ja teisaldasin faili tahvelarvutist arvutisse. Tegin pausi ja minu üllatuseks loodi fail uuesti ja torrent jätkas allalaadimist, nagu poleks midagi juhtunud.

Kuna torrent-klient seab failile, kuhu ta vastuvõetud andmed kirjutab, hõre lipu, ei ürita süsteem reserveerida korraga 16 GB ja 4 GB suurusest faili kirjutamisel ei teki viga.

Pärast protseduuri neljakordset kordamist sain arvutisse neli faili, mis sisaldasid sama torrenti erinevaid osi. Nüüd jääb üle vaid need kokku panna. Protseduur on sisuliselt lihtne. Peate nullbaidid asendama mõne muu väärtusega, kui see on ühes neljast failist antud kohas.

Mulle tundus, et selline lihtne programm peaks olema Internetis. Kas keegi pole sellise probleemiga kokku puutunud? Kuid mõistsin, et ma isegi ei tea, milliste märksõnade järgi seda otsida. Seetõttu lõin selle ülesande jaoks kiiresti Lua skripti ja nüüd olen selle optimeerinud. Seda ma tahan jagada.

Torrenti allalaadimine osade kaupa

  1. alustage torrenti allalaadimist esimeses seadmes
  2. oodake, kuni ROM on täidetud
  3. peatada allalaadimine
  4. teisaldage fail teise seadmesse ja lisage failinimele number
  5. pöördume tagasi esimesse punkti, kuni fail on täielikult alla laaditud

Osade ühendamine üheks failiks

Pärast viimase osa kättesaamist on vaja need koondada üheks tervikfailiks.

Ülesanne on lihtne:

  1. Kõigi osade korraga lugemine
  2. Kui mõnes osas ei ole asukoht nullbait, siis kirjutame selle väljundisse, muidu kirjutame nulli

Funktsioon merge_part võtab vastu lõime massiivi streams_in millest loetakse osa suurusest buffer_length ja tagastab erinevatest lõimedest osade liitmise tulemuse.

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
--[[

Funktsioon string.gsub sobib ülesande täitmiseks, sest leiab nullidega täidetud tükid ja toimetab selle, mis talle ette antakse.

--]]
                out_part = out_part:gsub(" +", function(zero_string)

                    if #in_part < find_index then
                        return -- не на что менять
                    end
--[[

string.gsub ei anna edasi asukohta, kus vaste leiti. Seetõttu otsime positsiooni paralleelselt zero_string funktsiooni kasutades string.find. Piisab esimese nullbaidi leidmisest.

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

--[[

Kui nüüd sisse in_part kohta on andmeid out_part kopeerige need.

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

Lõika alates in_part nullide jadale vastav osa.

--]]
                        local part = in_part:sub(start_index, end_index)

                        if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[

В part andmed on olemas.

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

part osutus väiksemaks kui nullide jada. Täiendame seda nendega.

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

Järeldus

Seega saime selle faili alla laadida ja arvutisse kokku panna. Pärast ühinemist tõmbasin torrenti faili tahvelarvutist välja. Installisin oma arvutisse torrent-kliendi ja kontrollisin faili sellega.

Tahvelarvutis viimati allalaaditud osa võib levitamisele jätta, kuid enne seda peate lubama osade uuesti kontrollimise ja tühjendama faili märge, et seda uuesti alla ei laaditaks.

Kasutatud:

  1. Flud torrenti klient tahvelarvutis.
  2. Torrenti klient qBittorent arvutis.
  3. Lua skript

Allikas: www.habr.com

Lisa kommentaar