Lawrlwytho torrent 16GB trwy dabled gyda 4GB o le rhydd

Lawrlwytho torrent 16GB trwy dabled gyda 4GB o le rhydd

Tasg:

Mae PC heb y Rhyngrwyd, ond mae'n bosibl trosglwyddo'r ffeil trwy USB. Mae yna dabled gyda'r Rhyngrwyd y gellir trosglwyddo'r ffeil hon ohoni. Gallwch chi lawrlwytho'r torrent gofynnol ar eich tabled, ond nid oes digon o le am ddim. Mae'r ffeil yn y llifeiriant yn un a mawr.

Llwybr i ddatrysiad:

Dechreuais y torrent i'w lawrlwytho. Pan oedd y gofod rhydd bron wedi mynd, fe wnes i oedi'r lawrlwythiad. Cysylltais y tabled i'r PC a symudais y ffeil o'r tabled i'r PC. Oedais ac er mawr syndod i mi crëwyd y ffeil eto a pharhaodd y cenllif i lawrlwytho fel pe na bai dim wedi digwydd.

Oherwydd bod y cleient torrent yn gosod y faner denau i'r ffeil y mae'n ysgrifennu'r data a dderbyniwyd ynddi, nid yw'r system yn ceisio cadw 16GB ar unwaith ac ni fydd gwall yn digwydd wrth geisio ysgrifennu at ffeil y tu hwnt i 4GB.

Ar ôl ailadrodd y weithdrefn bedair gwaith, derbyniais bedair ffeil ar fy PC yn cynnwys gwahanol rannau o'r un llifeiriant. Nawr y cyfan sydd ar ôl yw eu rhoi at ei gilydd. Mae'r weithdrefn yn ei hanfod yn syml. Mae angen i chi ddisodli'r sero bytes â gwerth arall os yw'n bodoli mewn safle penodol yn un o'r pedair ffeil.

Roedd yn ymddangos i mi y dylai rhaglen mor syml fod ar y Rhyngrwyd. Onid oes neb erioed wedi dod ar draws problem o'r fath? Ond sylweddolais nad wyf hyd yn oed yn gwybod pa eiriau allweddol i chwilio amdano. Felly, creais sgript Lua yn gyflym ar gyfer y dasg hon ac yn awr rwyf wedi ei optimeiddio. Dyma beth rydw i eisiau ei rannu.

Lawrlwytho'r torrent mewn rhannau

  1. dechreuwch lawrlwytho'r torrent ar y ddyfais gyntaf
  2. aros nes bod y ROM wedi'i lenwi
  3. oedi'r llwytho i lawr
  4. trosglwyddwch y ffeil i'r ail ddyfais ac ychwanegu rhif at enw'r ffeil
  5. dychwelwn i'r pwynt cyntaf nes bod y ffeil wedi'i lawrlwytho'n llwyr

Cyfuno rhannau i mewn i un ffeil

Ar ôl derbyn y rhan olaf, mae angen eu casglu mewn un ffeil gyfan.

Mae'r dasg yn syml:

  1. Darllen pob rhan ar unwaith
  2. Os nad yw'r sefyllfa mewn rhyw ran yn sero beit, yna rydyn ni'n ei ysgrifennu at yr allbwn, fel arall rydyn ni'n ysgrifennu sero

Swyddogaeth merge_part yn derbyn amrywiaeth o edafedd streams_in yr hwn sydd yn darllen dogn o faintioli buffer_length ac yn dychwelyd canlyniad uno rhannau o wahanol edafedd.

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

Swyddogaeth string.gsub yn addas ar gyfer y dasg oherwydd bydd yn dod o hyd i ddarnau wedi'u llenwi â sero ac yn cyflwyno'r hyn a roddir iddo.

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

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

string.gsub nid yw'n cyfleu'r safle y daethpwyd o hyd iddo. Felly, rydym yn gwneud chwiliad cyfochrog am y sefyllfa zero_string defnyddio'r swyddogaeth string.find. Mae'n ddigon dod o hyd i'r sero beit cyntaf.

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

--[[

Nawr os i mewn in_part mae data ar gyfer out_part eu copïo.

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

Torri o in_part rhan sy'n cyfateb i'r dilyniant o sero.

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

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

В part mae data.

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

part troi allan i fod yn llai na dilyniant o sero. Gadewch i ni ei ategu gyda nhw.

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

Casgliad

Felly, roeddem yn gallu lawrlwytho a chydosod y ffeil hon ar gyfrifiadur personol. Ar ôl yr uno, tynnais y ffeil torrent o'r tabled. Gosodais gleient torrent ar fy nghyfrifiadur personol a gwirio'r ffeil ag ef.

Gellir gadael y rhan a lawrlwythwyd ddiwethaf ar y tabled ar y dosbarthiad, ond mae angen i chi alluogi ail-wirio'r rhannau cyn hyn a dad-diciwch y ffeil fel nad yw'n llwytho i lawr eto.

Wedi'i ddefnyddio:

  1. Cleient torrent Flud ar dabled.
  2. Cleient torrent qBittorent ar PC.
  3. Sgript Lua

Ffynhonnell: hab.com

Ychwanegu sylw