Scaricare un torrent da 16 GB tramite un tablet con 4 GB di spazio libero
obiettivo:
C'è un PC senza Internet, ma è possibile trasferire il file tramite USB. C'è un tablet con Internet da cui è possibile trasferire questo file. Puoi scaricare il torrent richiesto sul tuo tablet, ma non c'è abbastanza spazio libero. Il file nel torrent è uno e grande.
Percorso verso la soluzione:
Ho avviato il download del torrent. Quando lo spazio libero era quasi esaurito, ho messo in pausa il download. Ho collegato il tablet al PC e ho spostato il file dal tablet al PC. Ho fatto una pausa e con mia sorpresa il file è stato creato di nuovo e il torrent ha continuato a scaricarsi come se nulla fosse successo.
Poiché il client torrent imposta il flag sparse sul file in cui scrive i dati ricevuti, il sistema non tenta di riservare 16 GB contemporaneamente e non si verificherà un errore quando si tenta di scrivere su un file oltre i 4 GB.
Dopo aver ripetuto la procedura quattro volte, ho ricevuto sul mio PC quattro file contenenti parti diverse dello stesso torrent. Adesso non resta che metterli insieme. La procedura è essenzialmente semplice. È necessario sostituire gli zero byte con un altro valore se esiste in una determinata posizione in uno dei quattro file.
Mi è sembrato che un programma così semplice dovesse essere su Internet. Nessuno ha mai riscontrato un problema del genere? Ma mi sono reso conto che non so nemmeno con quali parole chiave cercarlo. Pertanto, ho creato rapidamente uno script Lua per questa attività e ora l'ho ottimizzato. Questo è ciò che voglio condividere.
Scaricare il torrent in parti
inizia a scaricare il torrent sul primo dispositivo
attendere fino al riempimento della ROM
mettere in pausa il download
trasferire il file sul secondo dispositivo e aggiungere un numero al nome del file
torniamo al primo punto finché il file non viene scaricato completamente
Unione di parti in un unico file
Dopo aver ricevuto l'ultima parte, è necessario raccoglierli in un unico file.
Il compito è semplice:
Leggere tutte le parti contemporaneamente
Se in qualche parte la posizione non è un byte zero, lo scriviamo sull'output, altrimenti scriviamo zero
Funzione merge_part accetta una serie di thread streams_in di cui si legge una porzione di dimensione buffer_length e restituisce il risultato dell'unione di parti di thread diversi.
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
--[[
Funzione string.gsub è adatto al compito perché troverà i pezzi pieni di zeri e consegnerà ciò che gli viene dato.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub non indica la posizione in cui è stata trovata la corrispondenza. Pertanto, eseguiamo una ricerca parallela della posizione zero_string utilizzando la funzione string.find. È sufficiente trovare il primo byte zero.
Ora, se dentro in_part ci sono dati per out_part copiarli.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Taglia da in_part parte corrispondente alla sequenza di zeri.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part ci sono dati.
--]]
if #part == #zero_string then
return part
else
--[[
part risultò essere inferiore a una sequenza di zeri. Completiamolo con loro.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
conclusione
Pertanto, abbiamo potuto scaricare e assemblare questo file su un PC. Dopo la fusione, ho estratto il file torrent dal tablet. Ho installato un client torrent sul mio PC e ho controllato il file con esso.
L'ultima parte scaricata sul tablet può essere lasciata nella distribuzione, ma è necessario abilitare il ricontrollo delle parti precedenti e deselezionare il file in modo che non venga scaricato nuovamente.