งาน:
มีพีซีที่ไม่มีอินเทอร์เน็ต แต่สามารถถ่ายโอนไฟล์ผ่าน USB ได้ มีแท็บเล็ตที่มีอินเทอร์เน็ตซึ่งสามารถถ่ายโอนไฟล์นี้ได้ คุณสามารถดาวน์โหลดทอร์เรนต์ที่ต้องการบนแท็บเล็ตของคุณได้ แต่มีพื้นที่ว่างไม่เพียงพอ ไฟล์ในทอร์เรนต์เป็นไฟล์เดียวและใหญ่
เส้นทางสู่การแก้ปัญหา:
ฉันเริ่มทอร์เรนต์เพื่อดาวน์โหลด เมื่อพื้นที่ว่างใกล้จะหมด ฉันจึงหยุดการดาวน์โหลดชั่วคราว ฉันเชื่อมต่อแท็บเล็ตเข้ากับพีซี และย้ายไฟล์จากแท็บเล็ตไปยังพีซี ฉันหยุดชั่วคราวและต้องประหลาดใจที่ไฟล์ถูกสร้างขึ้นอีกครั้ง และทอร์เรนต์ก็ดาวน์โหลดต่อไปราวกับว่าไม่มีอะไรเกิดขึ้น
เนื่องจากไคลเอนต์ torrent ตั้งค่าสถานะกระจัดกระจายให้กับไฟล์ที่เขียนข้อมูลที่ได้รับ ระบบจะไม่พยายามสำรอง 16GB ในคราวเดียว และจะไม่เกิดข้อผิดพลาดเมื่อพยายามเขียนไปยังไฟล์ที่มีขนาดเกิน 4GB
หลังจากทำซ้ำขั้นตอนนี้สี่ครั้ง ฉันได้รับไฟล์สี่ไฟล์บนพีซีของฉันที่มีส่วนต่าง ๆ ของทอร์เรนต์เดียวกัน ตอนนี้สิ่งที่เหลืออยู่ก็คือการรวบรวมพวกมันเข้าด้วยกัน ขั้นตอนนั้นง่ายมาก คุณต้องแทนที่ศูนย์ไบต์ด้วยค่าอื่น หากมีอยู่ในตำแหน่งที่กำหนดในไฟล์ใดไฟล์หนึ่งจากสี่ไฟล์
สำหรับฉันดูเหมือนว่าโปรแกรมง่ายๆเช่นนี้ควรอยู่บนอินเทอร์เน็ต ไม่มีใครเคยประสบปัญหาดังกล่าวหรือไม่? แต่ฉันรู้ว่าฉันไม่รู้ด้วยซ้ำว่าจะค้นหาคำหลักอะไร ดังนั้นฉันจึงสร้างสคริปต์ 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
. ก็เพียงพอแล้วที่จะค้นหาไบต์ศูนย์แรก
--]]
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
ข้อสรุป
ดังนั้นเราจึงสามารถดาวน์โหลดและประกอบไฟล์นี้บนพีซีได้ หลังจากการควบรวมกิจการ ฉันดึงไฟล์ทอร์เรนต์ออกมาจากแท็บเล็ต ฉันติดตั้งไคลเอนต์ทอร์เรนต์บนพีซีของฉันและตรวจสอบไฟล์ด้วย
ส่วนที่ดาวน์โหลดล่าสุดบนแท็บเล็ตสามารถทิ้งไว้ในการแจกจ่ายได้ แต่คุณต้องเปิดใช้งานการตรวจสอบชิ้นส่วนก่อนหน้านี้อีกครั้ง และยกเลิกการเลือกไฟล์เพื่อไม่ให้ดาวน์โหลดอีกครั้ง
ใช้แล้ว:
- ไคลเอนต์ Flud torrent บนแท็บเล็ต
- ไคลเอนต์ฝนตกหนัก qBittorent บนพีซี
สคริปต์ลัวะ
ที่มา: will.com