Ներբեռնում է 16 ԳԲ տորրենտ 4 ԳԲ ազատ տարածություն ունեցող պլանշետի միջոցով

Ներբեռնում է 16 ԳԲ տորրենտ 4 ԳԲ ազատ տարածություն ունեցող պլանշետի միջոցով

Առաջադրանք.

Առանց ինտերնետի համակարգիչ կա, բայց ֆայլը հնարավոր է փոխանցել USB-ի միջոցով: Ինտերնետով պլանշետ կա, որտեղից կարելի է փոխանցել այս ֆայլը։ Դուք կարող եք ներբեռնել անհրաժեշտ torrent-ը ձեր պլանշետում, սակայն բավարար ազատ տարածք չկա: Ֆայլը torrent-ում մեկն է և մեծ:

Լուծման ուղին.

Ես սկսեցի torrent-ը ներբեռնելու համար: Երբ ազատ տարածքը գրեթե չկար, ես դադարեցրի ներբեռնումը: Ես պլանշետը միացրի համակարգչին և ֆայլը պլանշետից տեղափոխեցի համակարգիչ: Ես դադար տվեցի, և ի զարմանս ինձ, ֆայլը նորից ստեղծվեց, և torrent-ը շարունակեց ներբեռնումը, կարծես ոչինչ չէր եղել:

Շնորհիվ այն բանի, որ torrent հաճախորդը նոսր դրոշակ է սահմանում այն ​​ֆայլի վրա, որում գրում է ստացված տվյալները, համակարգը չի փորձում միանգամից 16 ԳԲ վերապահել և սխալ չի առաջանա 4 ԳԲ-ից ավելի ֆայլում գրելիս:

Ընթացակարգը չորս անգամ կրկնելուց հետո ես իմ համակարգչում ստացա չորս ֆայլ, որոնք պարունակում էին նույն torrent-ի տարբեր մասեր: Այժմ մնում է միայն դրանք հավաքել։ Գործընթացը ըստ էության պարզ է. Դուք պետք է փոխարինեք զրոյական բայթը մեկ այլ արժեքով, եթե այն առկա է չորս ֆայլերից մեկում տվյալ դիրքում:

Ինձ թվում էր, որ նման պարզ ծրագիր պետք է լինի ինտերնետում։ Երբևէ ոչ ոք նման խնդրի չի բախվել։ Բայց ես հասկացա, որ ես նույնիսկ չգիտեմ, թե ինչ հիմնաբառեր որոնել այն: Հետևաբար, ես արագ ստեղծեցի Lua սցենար այս առաջադրանքի համար և այժմ այն ​​օպտիմալացրել եմ: Սա այն է, ինչ ես ուզում եմ կիսվել:

Ներբեռնում է torrent-ը մաս-մաս

  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

Ամփոփում

Այսպիսով, մենք կարողացանք ներբեռնել և հավաքել այս ֆայլը համակարգչի վրա: Միաձուլումից հետո ես հանեցի torrent ֆայլը պլանշետից: Ես իմ համակարգչի վրա տեղադրեցի torrent հաճախորդ և ստուգեցի ֆայլը դրանով:

Պլանշետի վերջին ներբեռնված մասը կարելի է թողնել բաշխման վրա, բայց դուք պետք է ակտիվացնեք մասերի վերստուգումը մինչ այդ և հանեք ֆայլի նշումը, որպեսզի այն նորից չներբեռնվի:

Օգտագործված:

  1. Flud torrent հաճախորդ պլանշետի վրա:
  2. Torrent հաճախորդ qBittorent համակարգչի վրա:
  3. Լուա սցենար

Source: www.habr.com

Добавить комментарий