16 GB bo'sh joyga ega planshet orqali 4 GB torrent yuklab olish

16 GB bo'sh joyga ega planshet orqali 4 GB torrent yuklab olish

Vazifa:

Internetsiz kompyuter mavjud, lekin faylni USB orqali uzatish mumkin. Ushbu faylni o'tkazish mumkin bo'lgan Internetga ega planshet mavjud. Planshetingizga kerakli torrentni yuklab olishingiz mumkin, ammo bo'sh joy yetarli emas. Torrentdagi fayl bitta va katta.

Yechimga yo'l:

Yuklab olish uchun torrentni boshladim. Bo'sh joy deyarli tugagach, men yuklab olishni to'xtatdim. Men planshetni shaxsiy kompyuterga uladim va faylni planshetdan shaxsiy kompyuterga o'tkazdim. Men to'xtab qoldim va hayron bo'ldimki, fayl yana yaratildi va torrent hech narsa bo'lmagandek yuklab olishni davom ettirdi.

Torrent mijozi qabul qilingan ma'lumotlarni yozadigan faylga siyrak bayroqni o'rnatganligi sababli, tizim bir vaqtning o'zida 16 Gb ni zaxiralashga urinmaydi va 4 Gb dan ortiq faylga yozishga urinayotganda xatolik yuzaga kelmaydi.

Jarayonni to'rt marta takrorlaganimdan so'ng, men shaxsiy kompyuterimda bitta torrentning turli qismlarini o'z ichiga olgan to'rtta faylni oldim. Endi faqat ularni birlashtirish qoladi. Jarayon asosan oddiy. Nol baytni boshqa qiymat bilan almashtirishingiz kerak, agar u to'rtta fayldan birida ma'lum bir pozitsiyada mavjud bo'lsa.

Menga shunday oddiy dastur Internetda bo'lishi kerakdek tuyuldi. Hech kim bunday muammoga duch kelmaganmi? Lekin men uni qanday kalit so'zlarni qidirishni ham bilmasligimni angladim. Shuning uchun men tezda ushbu vazifa uchun Lua skriptini yaratdim va endi uni optimallashtirdim. Bu men baham ko'rmoqchi bo'lgan narsadir.

Torrent qismlarga bo'lib yuklab olish

  1. birinchi qurilmada torrentni yuklab olishni boshlang
  2. ROM to'lguncha kuting
  3. yuklab olishni to'xtatib turing
  4. faylni ikkinchi qurilmaga o'tkazing va fayl nomiga raqam qo'shing
  5. fayl to'liq yuklab olinmaguncha birinchi nuqtaga qaytamiz

Qismlarni bitta faylga birlashtirish

Oxirgi qism olingandan so'ng, ularni bitta faylga to'plash kerak.

Vazifa oddiy:

  1. Bir vaqtning o'zida barcha qismlarni o'qish
  2. Agar biror qismda pozitsiya nol bayt bo'lmasa, biz uni chiqishga yozamiz, aks holda biz nol yozamiz.

vazifa merge_part iplar qatorini qabul qiladi streams_in qaysi o'lchamning bir qismini o'qiydi buffer_length va turli iplardagi qismlarni birlashtirish natijasini qaytaradi.

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

vazifa string.gsub vazifa uchun mos keladi, chunki u nol bilan to'ldirilgan bo'laklarni topadi va unga berilgan narsalarni etkazib beradi.

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

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

string.gsub o'yin topilgan pozitsiyani bildirmaydi. Shuning uchun biz pozitsiyani parallel ravishda qidiramiz zero_string funksiyasidan foydalanish string.find. Birinchi nol baytni topish kifoya.

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

--[[

Endi kirsangiz in_part uchun ma'lumotlar mavjud out_part ularni nusxalash.

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

dan kesib oling in_part nollar ketma-ketligiga mos keladigan qism.

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

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

В part ma’lumotlar mavjud.

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

part nollar ketma-ketligidan kichik bo'lib chiqdi. Keling, buni ular bilan to'ldiramiz.

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

xulosa

Shunday qilib, biz ushbu faylni kompyuterga yuklab olib, yig'ishga muvaffaq bo'ldik. Birlashgandan so'ng, men torrent faylini planshetdan chiqarib oldim. Men kompyuterimga torrent mijozini o'rnatdim va u bilan faylni tekshirdim.

Planshetdagi so'nggi yuklab olingan qism tarqatishda qoldirilishi mumkin, ammo undan oldin qismlarni qayta tekshirishni yoqishingiz va fayl qayta yuklanmasligi uchun belgini olib tashlashingiz kerak.

Ishlatilgan:

  1. Planshetda Flud torrent mijozi.
  2. Kompyuterda torrent mijoz qBittorent.
  3. Lua skripti

Manba: www.habr.com

a Izoh qo'shish