Scaricatu un torrent 16GB via una tableta cù 4GB di spaziu liberu

Scaricatu un torrent 16GB via una tableta cù 4GB di spaziu liberu

Un compitu:

Ci hè un PC senza Internet, ma hè pussibule di trasfiriri u schedariu via USB. Ci hè una tavuletta cù Internet da quale stu schedariu pò esse trasferitu. Pudete scaricà u torrent necessariu nantu à a vostra tableta, ma ùn ci hè micca abbastanza spaziu liberu. U schedariu in u torrent hè unu è grande.

Percorsu per a suluzione:

Aghju cuminciatu u torrent per scaricà. Quandu u spaziu liberu era quasi sparitu, aghju pausa u scaricamentu. Aghju cunnessu a tableta à u PC è trasfirìu u schedariu da a tableta à u PC. Aghju fattu una pausa è à a mo sorpresa, u schedariu hè statu creatu di novu è u torrent hà cuntinuatu à scaricà cum'è s'ellu ùn era nunda.

A causa di u fattu chì u cliente torrent mette a bandiera sparse à u schedariu in u quale scrive i dati ricevuti, u sistema ùn prova micca di riservà 16GB à una volta è un errore ùn accade micca quandu pruvate di scrive à un schedariu oltre 4GB.

Dopu avè ripetutu a prucedura quattru volte, aghju ricevutu quattru schedari nantu à u mo PC chì cuntenenu diverse parti di u stessu torrent. Avà tuttu ciò chì resta hè di mette inseme. A prucedura hè essenzialmente simplice. Avete bisognu di rimpiazzà u cero byte cù un altru valore s'ellu esiste in una pusizione data in unu di i quattru schedari.

Mi paria chì un prugramma cusì simplice deve esse in Internet. Nimu ùn hà mai scontru un tali prublema? Ma aghju capitu chì ùn sò mancu sapè chì parole chjave per circà. Per quessa, aghju creatu rapidamente un script Lua per questu compitu è ​​avà l'aghju ottimisatu. Questu hè ciò chì vogliu sparte.

Scaricamentu di u torrent in parte

  1. cumincià à scaricà u torrent in u primu dispositivu
  2. aspettate finu à chì a ROM hè piena
  3. mette in pausa u scaricamentu
  4. trasfiriri u schedariu à u sicondu dispusitivu è aghjunghje un numeru à u nome di u schedariu
  5. turnemu à u primu puntu finu à chì u schedariu hè telecaricatu cumplettamente

Unisce e parti in un schedariu

Dopu chì l'ultima parte hè stata ricevuta, hè necessariu di cullà in un schedariu sanu.

U compitu hè simplice:

  1. Leghje tutte e parti in una volta
  2. Se in qualchì parte a pusizioni ùn hè micca un byte cero, allora scrivimu à l'output, altrimente scrivemu cero

funziunava merge_part accetta una serie di fili streams_in di quale leghje una parte di grandezza buffer_length è torna u risultatu di fusione di parti da diverse fili.

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

funziunava string.gsub hè adattatu per u compitu perchè truvà pezzi pieni di zeri è furnisce ciò chì hè datu.

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

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

string.gsub ùn trasmette micca a pusizione induve a partita hè stata trovata. Dunque, facemu una ricerca parallela per a pusizione zero_string usendu a funzione string.find. Hè abbastanza per truvà u primu byte zero.

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

--[[

Avà si in in_part ci sò dati per out_part copiali.

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

Tagliate da in_part parte chì currisponde à a sequenza di zeri.

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

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

В part ci sò dati.

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

part risultava esse menu di una sequenza di zeri. Fighjemu cun elli.

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

cunchiusioni

Cusì, avemu pussutu scaricà è assemblà stu schedariu nant'à un PC. Dopu à a fusione, aghju cacciatu u schedariu torrent da a tableta. Aghju installatu un cliente torrent in u mo PC è verificatu u schedariu cun ellu.

L'ultima parte telecaricata nantu à a tavuletta pò esse lasciata nantu à a distribuzione, ma avete bisognu di attivà a ricuperazione di e parti prima di questu è deseleche u schedariu per ùn esse scaricatu di novu.

Adupratu:

  1. Client torrent Flud nantu à una tableta.
  2. Client Torrent qBittorent nantu à PC.
  3. Lua script

Source: www.habr.com

Add a comment