ProHoster > بلوق > إدارة > تنزيل تورنت بسعة 16 جيجابايت عبر جهاز لوحي بمساحة خالية تبلغ 4 جيجابايت
تنزيل تورنت بسعة 16 جيجابايت عبر جهاز لوحي بمساحة خالية تبلغ 4 جيجابايت
المشكلة:
يوجد جهاز كمبيوتر بدون الإنترنت، ولكن من الممكن نقل الملف عبر USB. يوجد جهاز لوحي متصل بالإنترنت يمكن نقل هذا الملف منه. يمكنك تنزيل ملف التورنت المطلوب على جهازك اللوحي، ولكن لا توجد مساحة خالية كافية. الملف في التورنت واحد وكبير.
الطريق إلى الحل:
لقد بدأت تحميل التورنت. عندما انتهت المساحة الفارغة تقريبًا، قمت بإيقاف التنزيل مؤقتًا. لقد قمت بتوصيل الجهاز اللوحي بالكمبيوتر الشخصي وقمت بنقل الملف من الجهاز اللوحي إلى الكمبيوتر الشخصي. لقد توقفت مؤقتًا ولدهشتي تم إنشاء الملف مرة أخرى واستمر تنزيل التورنت وكأن شيئًا لم يحدث.
نظرًا لأن عميل التورنت يقوم بتعيين علامة متفرقة على الملف الذي يكتب فيه البيانات المستلمة، فإن النظام لا يحاول حجز 16 جيجابايت مرة واحدة ولن يحدث خطأ عند محاولة الكتابة إلى ملف يتجاوز 4 جيجابايت.
وبعد تكرار الإجراء أربع مرات، وصلتني أربعة ملفات على جهاز الكمبيوتر الخاص بي تحتوي على أجزاء مختلفة من نفس التورنت. الآن كل ما تبقى هو تجميعهم معًا. الإجراء بسيط في الأساس. تحتاج إلى استبدال البايتات الصفرية بقيمة أخرى إذا كانت موجودة في موضع معين في أحد الملفات الأربعة.
بدا لي أن مثل هذا البرنامج البسيط يجب أن يكون موجودًا على الإنترنت. وقد لا أحد واجه مثل هذه المشكلة من أي وقت مضى؟ لكنني أدركت أنني لا أعرف حتى الكلمات الرئيسية التي يجب البحث عنها. لذلك، قمت بسرعة بإنشاء برنامج Lua النصي لهذه المهمة وقمت الآن بتحسينه. هذا ما أريد مشاركته.
تحميل تورنت على أجزاء
ابدأ بتحميل التورنت على الجهاز الأول
انتظر حتى يتم ملء ROM
إيقاف التنزيل مؤقتًا
انقل الملف إلى الجهاز الثاني وأضف رقمًا إلى اسم الملف
نعود إلى النقطة الأولى حتى يتم تنزيل الملف بالكامل
دمج الأجزاء في ملف واحد
بعد استلام الجزء الأخير، من الضروري جمعها في ملف واحد كامل.
المهمة بسيطة:
قراءة جميع الأجزاء دفعة واحدة
إذا لم يكن الموضع في جزء ما بايت صفر، فإننا نكتبه في الإخراج، وإلا فإننا نكتب صفرًا
وظيفة 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. يكفي العثور على البايت الصفري الأول.
الآن إذا كان في 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
اختتام
وهكذا، تمكنا من تنزيل هذا الملف وتجميعه على جهاز الكمبيوتر. بعد الدمج، قمت بسحب ملف التورنت من الجهاز اللوحي. لقد قمت بتثبيت عميل تورنت على جهاز الكمبيوتر الخاص بي وفحصت الملف به.
يمكن ترك الجزء الأخير الذي تم تنزيله على الجهاز اللوحي على التوزيعة، ولكن يلزمك تمكين إعادة فحص الأجزاء قبل ذلك وإلغاء تحديد الملف حتى لا يتم تنزيله مرة أخرى.