Shkarkimi i një torrent 16 GB përmes një tableti me 4 GB hapësirë ​​të lirë

Shkarkimi i një torrent 16 GB përmes një tableti me 4 GB hapësirë ​​të lirë

Një detyrë:

Ekziston një kompjuter pa internet, por është e mundur të transferohet skedari përmes USB. Ekziston një tablet me internet nga i cili mund të transferohet ky skedar. Mund të shkarkoni torrentin e kërkuar në tabletin tuaj, por nuk ka hapësirë ​​të mjaftueshme të lirë. Skedari në torrent është një dhe i madh.

Rruga drejt zgjidhjes:

Fillova torrentin për të shkarkuar. Kur hapësira e lirë pothuajse ishte zhdukur, e ndalova shkarkimin. E lidha tabletin me PC dhe e zhvendosa skedarin nga tableti në PC. Unë ndalova dhe për habinë time skedari u krijua përsëri dhe torrenti vazhdoi shkarkimin sikur të mos kishte ndodhur asgjë.

Për shkak të faktit se klienti torrent vendos flamurin e rrallë në skedarin në të cilin shkruan të dhënat e marra, sistemi nuk përpiqet të rezervojë 16 GB menjëherë dhe nuk do të ndodhë një gabim kur përpiqeni të shkruani në një skedar përtej 4 GB.

Pasi e përsërita procedurën katër herë, mora katër skedarë në kompjuterin tim që përmbanin pjesë të ndryshme të të njëjtit torrent. Tani mbetet vetëm t'i bashkojmë ato. Procedura është në thelb e thjeshtë. Ju duhet të zëvendësoni bajtet zero me një vlerë tjetër nëse ajo ekziston në një pozicion të caktuar në një nga katër skedarët.

Më dukej se një program kaq i thjeshtë duhet të ishte në internet. Askush nuk ka hasur ndonjëherë në një problem të tillë? Por kuptova që as nuk di se çfarë fjalë kyçe të kërkoj. Prandaj, unë shpejt krijova një skript Lua për këtë detyrë dhe tani e kam optimizuar atë. Kjo është ajo që dua të ndaj.

Shkarkimi i torrentit në pjesë

  1. filloni të shkarkoni torrent në pajisjen e parë
  2. prisni derisa ROM-i të mbushet
  3. ndaloni shkarkimin
  4. transferoni skedarin në pajisjen e dytë dhe shtoni një numër në emrin e skedarit
  5. kthehemi në pikën e parë derisa skedari të shkarkohet plotësisht

Bashkimi i pjesëve në një skedar

Pasi të jetë marrë pjesa e fundit, është e nevojshme t'i grumbulloni ato në një skedar të tërë.

Detyra është e thjeshtë:

  1. Leximi i të gjitha pjesëve në të njëjtën kohë
  2. Nëse në një pjesë pozicioni nuk është një bajt zero, atëherë e shkruajmë atë në dalje, përndryshe shkruajmë zero

Funksion merge_part pranon një grup fijesh streams_in nga të cilat lexohet një pjesë e madhësisë buffer_length dhe kthen rezultatin e bashkimit të pjesëve nga fije të ndryshme.

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

Funksion string.gsub është i përshtatshëm për detyrën sepse do të gjejë copa të mbushura me zero dhe do të japë atë që i jepet.

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

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

string.gsub nuk përcjell pozicionin në të cilin është gjetur ndeshja. Prandaj, ne bëjmë një kërkim paralel për pozicionin zero_string duke përdorur funksionin string.find. Mjafton të gjesh bajtin e parë zero.

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

--[[

Tani nëse në in_part ka të dhëna për out_part kopjoni ato.

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

Prerë nga in_part pjesë që korrespondon me sekuencën e zerove.

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

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

В part ka të dhëna.

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

part doli të ishte më pak se një sekuencë zerosh. Le ta plotësojmë me to.

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

Përfundim

Kështu, ne mundëm ta shkarkonim dhe ta montonim këtë skedar në një kompjuter. Pas bashkimit, nxora skedarin torrent nga tableti. Unë instalova një klient torrent në kompjuterin tim dhe kontrollova skedarin me të.

Pjesa e fundit e shkarkuar në tablet mund të lihet në shpërndarje, por ju duhet të aktivizoni ri-kontrollin e pjesëve përpara kësaj dhe zgjidhni skedarin në mënyrë që të mos shkarkohet më.

Përdorur:

  1. Klient Flud torrent në një tabletë.
  2. Klienti torrent qBittorent në PC.
  3. Skenari Lua

Burimi: www.habr.com

Shto një koment