Nagda-download ng 16GB na torrent sa pamamagitan ng isang tablet na may 4GB na libreng espasyo

Nagda-download ng 16GB na torrent sa pamamagitan ng isang tablet na may 4GB na libreng espasyo

Problema:

Mayroong isang PC na walang Internet, ngunit posible na ilipat ang file sa pamamagitan ng USB. Mayroong isang tablet na may Internet kung saan maaaring ilipat ang file na ito. Maaari mong i-download ang kinakailangang torrent sa iyong tablet, ngunit walang sapat na libreng espasyo. Ang file sa torrent ay isa at malaki.

Landas patungo sa solusyon:

Sinimulan ko ang pag-download ng torrent. Nang halos wala na ang libreng espasyo, na-pause ko ang pag-download. Ikinonekta ko ang tablet sa PC at inilipat ang file mula sa tablet patungo sa PC. I paused and to my surprise na-create ulit ang file at nagpatuloy ang torrent sa pag-download na parang walang nangyari.

Dahil sa ang katunayan na ang torrent client ay nagtatakda ng kalat-kalat na bandila sa file kung saan isinulat nito ang natanggap na data, hindi sinusubukan ng system na magreserba ng 16GB nang sabay-sabay at hindi magkakaroon ng error kapag sinusubukang magsulat sa isang file na lampas sa 4GB.

Matapos ulitin ang pamamaraan ng apat na beses, nakatanggap ako ng apat na file sa aking PC na naglalaman ng iba't ibang bahagi ng parehong torrent. Ngayon ang natitira na lang ay pagsama-samahin sila. Ang pamamaraan ay mahalagang simple. Kailangan mong palitan ang zero byte ng isa pang halaga kung ito ay umiiral sa isang naibigay na posisyon sa isa sa apat na mga file.

Tila sa akin na ang gayong simpleng programa ay dapat na nasa Internet. Wala bang nakaranas ng ganitong problema? Ngunit napagtanto ko na hindi ko alam kung anong mga keyword ang hahanapin dito. Samakatuwid, mabilis akong gumawa ng Lua script para sa gawaing ito at ngayon ay na-optimize ko na ito. Ito ang gusto kong ibahagi.

Pag-download ng torrent sa mga bahagi

  1. simulan ang pag-download ng torrent sa unang device
  2. maghintay hanggang mapuno ang ROM
  3. i-pause ang pag-download
  4. ilipat ang file sa pangalawang device at magdagdag ng numero sa pangalan ng file
  5. bumalik kami sa unang punto hanggang sa ganap na ma-download ang file

Pinagsasama ang mga bahagi sa isang file

Matapos matanggap ang huling bahagi, kinakailangan na kolektahin ang mga ito sa isang buong file.

Ang gawain ay simple:

  1. Binabasa ang lahat ng bahagi nang sabay-sabay
  2. Kung sa ilang bahagi ang posisyon ay hindi isang zero byte, pagkatapos ay isusulat namin ito sa output, kung hindi man ay isusulat namin ang zero

Tungkulin merge_part tumatanggap ng hanay ng mga thread streams_in na kung saan ay nagbabasa ng isang bahagi ng laki buffer_length at ibinabalik ang resulta ng pagsasama ng mga bahagi mula sa iba't ibang mga thread.

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

Tungkulin string.gsub ay angkop para sa gawain dahil makakahanap ito ng mga piraso na puno ng mga zero at ihahatid ang ibinigay dito.

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

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

string.gsub hindi ipinapahiwatig ang posisyon kung saan natagpuan ang tugma. Samakatuwid, gumagawa kami ng parallel na paghahanap para sa posisyon zero_string gamit ang function string.find. Ito ay sapat na upang mahanap ang unang zero byte.

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

--[[

Ngayon kung nasa in_part may data para sa out_part kopyahin sila.

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

Putol mula sa in_part bahagi na tumutugma sa pagkakasunud-sunod ng mga zero.

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

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

В part may data.

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

part naging mas mababa sa isang sequence ng mga zero. Dagdagan natin ito sa kanila.

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

Konklusyon

Kaya, nagawa naming i-download at i-assemble ang file na ito sa isang PC. Pagkatapos ng pagsasama, kinuha ko ang torrent file mula sa tablet. Nag-install ako ng torrent client sa aking PC at sinuri ang file kasama nito.

Ang huling na-download na bahagi sa tablet ay maaaring iwanang sa pamamahagi, ngunit kailangan mong paganahin ang muling pagsuri ng mga bahagi bago ito at alisan ng tsek ang file upang hindi ito muling ma-download.

Ginamit:

  1. Flud torrent client sa isang tablet.
  2. Torrent client qBittorent sa PC.
  3. Lua script

Pinagmulan: www.habr.com

Magdagdag ng komento