Download af en 16 GB torrent via en tablet med 4 GB ledig plads

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

  1. begynde at downloade torrenten på den første enhed
  2. vent til ROM'en er fyldt
  3. pause download
  4. overføre filen til den anden enhed og tilføje et nummer til filnavnet
  5. 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:

  1. Læser alle dele på én gang
  2. 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.

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

--[[

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.

Brugt:

  1. Flud torrent-klient på en tablet.
  2. Torrent-klient qBittorent på PC.
  3. Lua script

Kilde: www.habr.com

Tilføj en kommentar