Download vun engem 16GB Torrent iwwer eng Tablet mat 4GB fräi Plaz

Download vun engem 16GB Torrent iwwer eng Tablet mat 4GB fräi Plaz

Eng Aufgab:

Et gëtt e PC ouni Internet, awer et ass méiglech d'Datei iwwer USB ze transferéieren. Et gëtt en Tablet mam Internet vun deem dës Datei iwwerdroe ka ginn. Dir kënnt den erfuerderlechen Torrent op Ärem Tablet eroflueden, awer et ass net genuch fräi Plaz. D'Datei am Torrent ass eng a grouss.

Wee zur Léisung:

Ech hunn den Torrent ugefaang fir erofzelueden. Wann de fräie Raum bal fort war, hunn ech den Download gestoppt. Ech hunn den Tablet mam PC verbonnen an d'Datei vum Tablet op de PC geplënnert. Ech hunn gestoppt an zu menger Iwwerraschung gouf d'Datei erëm erstallt an den Torrent huet weider erofgelueden wéi wann näischt geschitt wier.

Wéinst der Tatsaach, datt de Torrent Client de sparse Fändel op d'Datei setzt, an där se déi kritt Donnéeën schreift, probéiert de System net 16GB gläichzäiteg ze reservéieren an e Feeler wäert net optrieden wann Dir probéiert op eng Datei iwwer 4GB ze schreiwen.

Nodeems ech d'Prozedur véier Mol widderholl hunn, krut ech véier Dateien op mengem PC mat verschiddenen Deeler vum selwechte Torrent. Elo bleift et just fir se zesummen ze setzen. D'Prozedur ass wesentlech einfach. Dir musst d'Nullbytes mat engem anere Wäert ersetzen, wann et op enger bestëmmter Positioun an enger vun de véier Dateien existéiert.

Et huet mir geschéngt datt sou en einfache Programm um Internet sollt sinn. Huet nach keen esou e Problem begéint? Awer ech hu gemierkt datt ech net emol weess wéi eng Schlësselwierder fir no ze sichen. Dofir hunn ech séier e Lua Skript fir dës Aufgab erstallt an elo hunn ech et optimiséiert. Dëst ass wat ech wëll deelen.

Den Torrent an Deeler eroflueden

  1. Start den Torrent op den éischten Apparat erofzelueden
  2. waart bis d'ROM gefëllt ass
  3. Paus den Download
  4. Transfert d'Datei op den zweeten Apparat a füügt eng Nummer un de Dateinumm
  5. mir zréck op den éischte Punkt bis de Fichier komplett erofgeluede ass

Fusioun Deeler an eng Datei

Nodeems de leschten Deel kritt ass, ass et néideg se an eng ganz Datei ze sammelen.

D'Aufgab ass einfach:

  1. Liest all Deeler op eemol
  2. Wann an engem Deel d'Positioun net en Nullbyte ass, da schreiwen mir et op d'Ausgab, soss schreiwen mir Null

Funktioun merge_part akzeptéiert eng Rei vun thread streams_in vun deem liest eng Portioun Gréisst buffer_length a gëtt d'Resultat vun der Fusioun vun Deeler aus verschiddene Threads zréck.

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

Funktioun string.gsub ass gëeegent fir d'Aufgab, well et Stécker gefëllt mat Nullen fannen a liwweren wat et gëtt.

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

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

string.gsub vermëttelt net d'Positioun op där de Match fonnt gouf. Dofir maache mir eng parallel Sich no der Positioun zero_string benotzt d'Funktioun string.find. Et ass genuch fir den éischten Nullbyte ze fannen.

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

--[[

Elo wann an in_part et gëtt daten fir out_part kopéieren hinnen.

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

Aus schneiden in_part Deel entspriechend der Sequenz vun Nullen.

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

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

В part et gëtt daten.

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

part huet sech manner wéi eng Sequenz vun Nullen erausgestallt. Loosst eis et mat hinnen ergänzen.

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

Konklusioun

Sou konnte mir dës Datei op engem PC eroflueden an zesummestellen. No der Fusioun hunn ech d'Torrentdatei vum Tablet erausgezunn. Ech hunn en Torrent Client op mengem PC installéiert an d'Datei domat iwwerpréift.

De leschten erofgelueden Deel op der Tablet kann op der Verdeelung hannerlooss ginn, awer Dir musst d'Wiederiwwerpréiwung vun den Deeler virun dësem aktivéieren an d'Datei auschecken fir datt se net erëm erofluet.

Benotzt:

  1. Flud Torrent Client op engem Tablet.
  2. Torrent Client qBittorent op PC.
  3. Lua Skript

Source: will.com

Setzt e Commentaire