Laste ned en 16 GB torrent via et nettbrett med 4 GB ledig plass

Laste ned en 16 GB torrent via et nettbrett med 4 GB ledig plass

Mål:

Det finnes en PC uten Internett, men det er mulig å overføre filen via USB. Det er et nettbrett med Internett som denne filen kan overføres fra. Du kan laste ned den nødvendige torrenten på nettbrettet ditt, men det er ikke nok ledig plass. Filen i torrenten er én og stor.

Vei til løsning:

Jeg startet torrenten for å laste ned. Da den ledige plassen nesten var borte, satte jeg nedlastingen på pause. Jeg koblet nettbrettet til PC-en og flyttet filen fra nettbrettet til PC-en. Jeg stoppet og til min overraskelse ble filen opprettet igjen og torrenten fortsatte å laste ned som om ingenting hadde skjedd.

På grunn av det faktum at torrentklienten setter sparse-flagget til filen der den skriver de mottatte dataene, prøver ikke systemet å reservere 16 GB på en gang, og det vil ikke oppstå en feil når du prøver å skrive til en fil over 4 GB.

Etter å ha gjentatt prosedyren fire ganger, mottok jeg fire filer på PC-en min som inneholder forskjellige deler av samme torrent. Nå gjenstår det bare å sette dem sammen. Prosedyren er i hovedsak enkel. Du må erstatte nullbytene med en annen verdi hvis den finnes på en gitt posisjon i en av de fire filene.

Det virket for meg at et så enkelt program burde være på Internett. Har ingen noen gang vært borti et slikt problem? Men jeg innså at jeg ikke engang vet hvilke søkeord jeg skal søke etter det. Derfor laget jeg raskt et Lua-skript for denne oppgaven og nå har jeg optimalisert det. Dette er hva jeg vil dele.

Laste ned torrent i deler

  1. begynn å laste ned torrenten på den første enheten
  2. vent til ROM-en er fylt
  3. pause nedlastingen
  4. overføre filen til den andre enheten og legg til et nummer i filnavnet
  5. vi går tilbake til det første punktet til filen er lastet ned fullstendig

Slå sammen deler til én fil

Etter at den siste delen er mottatt, er det nødvendig å samle dem i en hel fil.

Oppgaven er enkel:

  1. Leser alle deler på en gang
  2. Hvis posisjonen på en eller annen måte ikke er en nullbyte, skriver vi den til utgangen, ellers skriver vi null

Funksjon merge_part godtar en rekke tråder streams_in som leser en del av størrelsen buffer_length og returnerer resultatet av sammenslåing av deler fra forskjellige tråder.

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

Funksjon string.gsub passer for oppgaven fordi den vil finne brikker fylt med nuller og levere det som er gitt til den.

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

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

string.gsub formidler ikke posisjonen der kampen ble funnet. Derfor gjør vi et parallelt søk etter stillingen zero_string ved å bruke funksjonen string.find. Det er nok å finne den første nullbyten.

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

--[[

Nå hvis i in_part det finnes data for out_part kopiere dem.

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

Klipp fra in_part del som tilsvarer sekvensen av nuller.

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

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

В part det er data.

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

part viste seg å være mindre enn en sekvens med nuller. La oss 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

Konklusjon

Dermed var vi i stand til å laste ned og sette sammen denne filen på en PC. Etter sammenslåingen trakk jeg ut torrentfilen fra nettbrettet. Jeg installerte en torrent-klient på PC-en min og sjekket filen med den.

Den sist nedlastede delen på nettbrettet kan stå på distribusjonen, men du må aktivere re-sjekking av delene før dette og fjerne merket for filen slik at den ikke lastes ned igjen.

Brukt:

  1. Flud torrent-klient på et nettbrett.
  2. Torrent-klient qBittorent på PC.
  3. Lua manus

Kilde: www.habr.com

Legg til en kommentar