16 GB torrent atsisiuntimas per planšetinį kompiuterį su 4 GB laisvos vietos

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

  1. pradėkite atsisiųsti torrent iš pirmojo įrenginio
  2. palaukite, kol ROM bus užpildytas
  3. pristabdyti atsisiuntimą
  4. perkelkite failą į antrą įrenginį ir pridėkite numerį prie failo pavadinimo
  5. 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:

  1. Skaityti visas dalis vienu metu
  2. 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ą.

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

--[[

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.

Naudota:

  1. Flud torrent klientas planšetiniame kompiuteryje.
  2. Torrent klientas qBittorent kompiuteryje.
  3. Lua scenarijus

Šaltinis: www.habr.com

Добавить комментарий