Unduh torrent 16GB via tablet dengan ruang kosong 4GB


Tantangan:


Ada PC tanpa Internet tetapi dimungkinkan untuk mentransfer file melalui USB. Ada tablet dengan Internet dari mana file ini dapat ditransfer. Di tablet Anda dapat mengunduh torrent yang diinginkan tetapi tidak cukup ruang kosong. File dalam torrent itu tunggal dan besar.


Cara menuju solusi:


Saya memulai torrent untuk mengunduh. Ketika ruang kosong hampir berakhir, saya menjeda unduhan. Saya menghubungkan tablet ke PC dan memindahkan file dari tablet ke PC. Dia berhenti dan, yang mengejutkan saya, file itu dibuat lagi dan torrent terus berayun lebih jauh seolah-olah tidak ada yang terjadi.


Karena fakta bahwa klien torrent menetapkan flag sparse ke file di mana ia menulis data yang diterima, sistem tidak segera mencoba untuk memesan 16GB dan tidak akan ada kesalahan ketika mencoba menulis ke file melebihi 4GB.


Mengulangi prosedur empat kali, saya menerima empat file pada PC di mana bagian-bagian yang berbeda dari torrent yang sama. Sekarang tinggal mengumpulkan mereka bersama. Prosedur ini pada dasarnya sederhana. Penting untuk mengganti nol byte dengan nilai lain jika berada dalam posisi ini di salah satu dari empat file.


Bagi saya, program sederhana seperti itu seharusnya ada di Internet. Benarkah tidak ada yang menghadapi tugas seperti itu? Tetapi saya menyadari bahwa saya bahkan tidak tahu kata kunci apa yang harus dicari untuknya. Karena itu, saya dengan cepat melemparkan skrip Lua untuk tugas ini dan sekarang saya telah mengoptimalkannya. Saya ingin membagikannya.


Unduh torrent di bagian-bagiannya


  1. mulai mengunduh torrent di perangkat pertama
  2. tunggu sampai ROM terisi
  3. jeda unduhan
  4. mentransfer file ke perangkat kedua dan menambahkan angka ke nama file
  5. kembali ke titik pertama hingga file diunduh sepenuhnya

Gabungkan bagian menjadi satu file


Setelah bagian terakhir diterima, perlu untuk mengumpulkan mereka menjadi satu file lengkap.


Tugasnya sederhana:


  1. Baca semua bagian sekaligus
  2. Jika pada beberapa bagian dalam posisi byte non-nol ditulis ke output, jika tidak kita tulis nol

Fungsi merge_part mengambil array streams_in stream dari mana ia membaca bagian dari ukuran buffer_length dan mengembalikan hasil menggabungkan bagian dari aliran yang berbeda.


 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("[^\0]") --    in_part and out_part:find("\0", 1, true) --     out_part then local find_index = 1 --[[ 

Fungsi string.gsub cocok untuk tugas karena akan menemukan potongan diisi dengan nol dan meletakkan apa yang diteruskan ke sana.


 --]] out_part = out_part:gsub("\0+", function(zero_string) if #in_part < find_index then return --     end --[[ 

string.gsub tidak meneruskan posisi menemukan kecocokan. Oleh karena itu, kami melakukan pencarian paralel untuk posisi zero_string menggunakan fungsi string.find . Cukup untuk menemukan byte nol pertama.


 --]] local start_index = out_part:find("\0", find_index, true) find_index = start_index + #zero_string --[[ 

Sekarang, jika in_part memiliki data untuk out_part salinlah.


 --]] if #in_part >= start_index then local end_index = start_index + #zero_string - 1 --[[ 

Kami memotong bagian yang sesuai dengan urutan nol dari in_part .


 --]] local part = in_part:sub(start_index, end_index) if (part:byte(1) ~= 0) or part:find("[^\0]") then --[[ 

Ada part data.


 --]] if #part == #zero_string then return part else --[[ 

part ternyata kurang dari urutan nol. Kami melengkapi dengan mereka.


 --]] return part..zero_string:sub(1, end_index - #in_part) end end end end) end end end return out_part end 

Kesimpulan


Dengan demikian, dimungkinkan untuk mengunduh dan mengumpulkan file ini di PC. Setelah merger, saya mengeluarkan file torrent dari tablet. Saya menginstal klien torrent pada PC dan memeriksa file itu.


Bagian yang terakhir diunduh di tablet dapat dibiarkan pada distribusi, tetapi Anda harus mengaktifkan pemeriksaan berulang dari bagian-bagian sebelum ini dan hapus centang file tersebut sehingga tidak mengunduh lagi.


Digunakan:


  1. Klien Torrent Flud di tablet.
  2. QBittorent torrent client di PC.
  3. Naskah Lua

Source: https://habr.com/ru/post/id473636/


All Articles