Преузимање торрента од 16 ГБ преко таблета са 4 ГБ слободног простора

Преузимање торрента од 16 ГБ преко таблета са 4 ГБ слободног простора

Задатак:

Постоји рачунар без интернета, али је могуће пренети фајл преко УСБ-а. Постоји таблет са интернетом са којег се ова датотека може пренети. Можете преузети потребан торрент на свој таблет, али нема довољно слободног простора. Фајл у торенту је један и велики.

Пут до решења:

Покренуо сам торрент за преузимање. Када је слободан простор скоро нестао, паузирао сам преузимање. Повезао сам таблет са рачунаром и преместио датотеку са таблета на рачунар. Паузирао сам и на моје изненађење датотека је поново креирана, а торрент је наставио да се преузима као да се ништа није догодило.

Због чињенице да торрент клијент поставља ретку заставицу датотеци у коју уписује примљене податке, систем не покушава да резервише 16ГБ одједном и неће доћи до грешке када покушате да упишете у датотеку већу од 4ГБ.

Након што сам четири пута поновио процедуру, добио сам четири фајла на свом рачунару који садрже различите делове истог торрента. Сада остаје само да их спојимо. Процедура је у суштини једноставна. Морате да замените нулте бајтове другом вредношћу ако постоји на датој позицији у једној од четири датотеке.

Чинило ми се да би тако једноставан програм требао бити на Интернету. Зар се нико никада није сусрео са таквим проблемом? Али схватио сам да чак ни не знам које кључне речи да тражим. Стога сам брзо направио Луа скрипту за овај задатак и сада сам је оптимизовао. Ово је оно што желим да поделим.

Преузимање торрента у деловима

  1. почните да преузимате торрент на првом уређају
  2. сачекајте док се РОМ не попуни
  3. паузирајте преузимање
  4. пренесите датотеку на други уређај и додајте број имену датотеке
  5. враћамо се на прву тачку док се датотека не преузме у потпуности

Спајање делова у једну датотеку

Након што је последњи део примљен, потребно их је сакупити у једну целину.

Задатак је једноставан:

  1. Читање свих делова одједном
  2. Ако у неком делу позиција није нула бајт, онда је уписујемо на излаз, у супротном пишемо нулу

Функција merge_part прихвата низ нити streams_in од којих гласи део величине buffer_length и враћа резултат спајања делова из различитих нити.

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

Функција string.gsub је погодан за задатак јер ће пронаћи комаде испуњене нулама и испоручити оно што му је дато.

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

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

string.gsub не преноси позицију на којој је пронађена утакмица. Због тога радимо паралелну претрагу позиције zero_string користећи функцију string.find. Довољно је пронаћи први нулти бајт.

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

--[[

Сада ако у in_part постоје подаци за out_part копирајте их.

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

Цут фром in_part део који одговара низу нула.

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

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

В part постоје подаци.

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

part испоставило се да је мањи од низа нула. Хајде да то допунимо њима.

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

Закључак

Тако смо успели да преузмемо и саставимо ову датотеку на рачунару. Након спајања, извукао сам торрент фајл са таблета. Инсталирао сам торрент клијент на свој рачунар и проверио датотеку са њим.

Последњи преузети део на таблету можете оставити на дистрибуцији, али морате да омогућите поновну проверу делова пре овога и поништите ознаку датотеке да се не би поново преузела.

Користи се:

  1. Флуд торрент клијент на таблету.
  2. Торрент клијент кБитторент на рачунару.
  3. Луа скрипта

Извор: ввв.хабр.цом

Додај коментар