Преземање торент од 16 GB преку таблет со 4 GB слободен простор

Преземање торент од 16 GB преку таблет со 4 GB слободен простор

Задача:

Има компјутер без Интернет, но можно е да се префрли датотеката преку USB. Има таблет со Интернет од кој може да се префрли оваа датотека. Можете да го преземете потребниот торент на вашиот таблет, но нема доволно слободен простор. Датотеката во торентот е една и голема.

Патот до решението:

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

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

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

Ми се чинеше дека таква едноставна програма треба да има на Интернет. Никој досега не наишол на таков проблем? Но, сфатив дека дури и не знам кои клучни зборови да ги барам. Затоа, брзо создадов скрипта Луа за оваа задача и сега ја оптимизирав. Ова е она што сакам да го споделам.

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

  1. започнете да го преземате торентот на првиот уред
  2. почекајте додека не се пополни ROM-от
  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. Flud torrent клиент на таблет.
  2. Торент клиент qBittorent на компјутер.
  3. Скрипта Луа

Извор: www.habr.com

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