دانلود تورنت 16 گیگابایتی از طریق تبلت با 4 گیگابایت فضای رایگان

دانلود تورنت 16 گیگابایتی از طریق تبلت با 4 گیگابایت فضای رایگان

چالش:

یک کامپیوتر بدون اینترنت وجود دارد، اما امکان انتقال فایل از طریق USB وجود دارد. تبلتی با اینترنت وجود دارد که می توان این فایل را از آن منتقل کرد. می توانید تورنت مورد نیاز را در رایانه لوحی خود بارگیری کنید، اما فضای خالی کافی وجود ندارد. فایل موجود در تورنت یک و بزرگ است.

راه حل:

من تورنت رو برای دانلود شروع کردم. وقتی فضای خالی تقریبا تمام شد، دانلود را متوقف کردم. تبلت را به رایانه شخصی وصل کردم و فایل را از تبلت به رایانه شخصی منتقل کردم. مکث کردم و در کمال تعجب فایل دوباره ایجاد شد و تورنت به دانلود ادامه داد انگار هیچ اتفاقی نیفتاده است.

با توجه به اینکه کلاینت تورنت پرچم پراکنده را روی فایلی که داده های دریافتی را در آن می نویسد تنظیم می کند، سیستم سعی نمی کند یکباره 16 گیگابایت را رزرو کند و هنگام تلاش برای نوشتن روی فایلی بیش از 4 گیگابایت خطایی رخ نمی دهد.

پس از چهار بار تکرار این روش، من چهار فایل را بر روی رایانه شخصی خود دریافت کردم که شامل قسمت های مختلف یک تورنت بود. حالا تنها چیزی که باقی مانده این است که آنها را کنار هم قرار دهیم. این روش اساسا ساده است. اگر بایت صفر در یکی از چهار فایل موجود باشد، باید مقدار دیگری را جایگزین کنید.

به نظر من چنین برنامه ساده ای باید در اینترنت باشد. آیا تا به حال کسی با چنین مشکلی مواجه نشده است؟ اما متوجه شدم که حتی نمی دانم چه کلمات کلیدی را جستجو کنم. بنابراین، من به سرعت یک اسکریپت Lua برای این کار ایجاد کردم و اکنون آن را بهینه کرده ام. این چیزی است که من می خواهم به اشتراک بگذارم.

دانلود تورنت به صورت قسمتی

  1. شروع به دانلود تورنت در دستگاه اول کنید
  2. صبر کنید تا رام پر شود
  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

نتیجه

بنابراین، ما توانستیم این فایل را در رایانه شخصی دانلود و مونتاژ کنیم. بعد از ادغام، فایل تورنت را از تبلت بیرون کشیدم. من یک کلاینت تورنت را روی رایانه شخصی خود نصب کردم و فایل را با آن بررسی کردم.

آخرین قسمت دانلود شده در تبلت را می توان در توزیع گذاشت، اما باید قبل از این بررسی مجدد قطعات را فعال کنید و تیک فایل را بردارید تا دوباره دانلود نشود.

استفاده شده:

  1. کلاینت تورنت فلود در تبلت.
  2. مشتری تورنت qBittorent در رایانه شخصی.
  3. فیلمنامه لوا

منبع: www.habr.com

اضافه کردن نظر