تنزيل تورنت بسعة 16 جيجابايت عبر جهاز لوحي بمساحة خالية تبلغ 4 جيجابايت

تنزيل تورنت بسعة 16 جيجابايت عبر جهاز لوحي بمساحة خالية تبلغ 4 جيجابايت

المشكلة:

يوجد جهاز كمبيوتر بدون الإنترنت، ولكن من الممكن نقل الملف عبر USB. يوجد جهاز لوحي متصل بالإنترنت يمكن نقل هذا الملف منه. يمكنك تنزيل ملف التورنت المطلوب على جهازك اللوحي، ولكن لا توجد مساحة خالية كافية. الملف في التورنت واحد وكبير.

الطريق إلى الحل:

لقد بدأت تحميل التورنت. عندما انتهت المساحة الفارغة تقريبًا، قمت بإيقاف التنزيل مؤقتًا. لقد قمت بتوصيل الجهاز اللوحي بالكمبيوتر الشخصي وقمت بنقل الملف من الجهاز اللوحي إلى الكمبيوتر الشخصي. لقد توقفت مؤقتًا ولدهشتي تم إنشاء الملف مرة أخرى واستمر تنزيل التورنت وكأن شيئًا لم يحدث.

نظرًا لأن عميل التورنت يقوم بتعيين علامة متفرقة على الملف الذي يكتب فيه البيانات المستلمة، فإن النظام لا يحاول حجز 16 جيجابايت مرة واحدة ولن يحدث خطأ عند محاولة الكتابة إلى ملف يتجاوز 4 جيجابايت.

وبعد تكرار الإجراء أربع مرات، وصلتني أربعة ملفات على جهاز الكمبيوتر الخاص بي تحتوي على أجزاء مختلفة من نفس التورنت. الآن كل ما تبقى هو تجميعهم معًا. الإجراء بسيط في الأساس. تحتاج إلى استبدال البايتات الصفرية بقيمة أخرى إذا كانت موجودة في موضع معين في أحد الملفات الأربعة.

بدا لي أن مثل هذا البرنامج البسيط يجب أن يكون موجودًا على الإنترنت. وقد لا أحد واجه مثل هذه المشكلة من أي وقت مضى؟ لكنني أدركت أنني لا أعرف حتى الكلمات الرئيسية التي يجب البحث عنها. لذلك، قمت بسرعة بإنشاء برنامج Lua النصي لهذه المهمة وقمت الآن بتحسينه. هذا ما أريد مشاركته.

تحميل تورنت على أجزاء

  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

اختتام

وهكذا، تمكنا من تنزيل هذا الملف وتجميعه على جهاز الكمبيوتر. بعد الدمج، قمت بسحب ملف التورنت من الجهاز اللوحي. لقد قمت بتثبيت عميل تورنت على جهاز الكمبيوتر الخاص بي وفحصت الملف به.

يمكن ترك الجزء الأخير الذي تم تنزيله على الجهاز اللوحي على التوزيعة، ولكن يلزمك تمكين إعادة فحص الأجزاء قبل ذلك وإلغاء تحديد الملف حتى لا يتم تنزيله مرة أخرى.

مستخدم:

  1. عميل Flud سيل على الكمبيوتر اللوحي.
  2. عميل تورنت qBittorent على جهاز الكمبيوتر.
  3. نص لوا

المصدر: www.habr.com

إضافة تعليق