
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
- mulai mengunduh torrent di perangkat pertama
- tunggu sampai ROM terisi
- jeda unduhan
- mentransfer file ke perangkat kedua dan menambahkan angka ke nama file
- 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:
- Baca semua bagian sekaligus
- 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
Fungsi string.gsub
cocok untuk tugas karena akan menemukan potongan diisi dengan nol dan meletakkan apa yang diteruskan ke sana.
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.
Sekarang, jika in_part
memiliki data untuk out_part
salinlah.
Kami memotong bagian yang sesuai dengan urutan nol dari in_part
.
Ada part
data.
part
ternyata kurang dari urutan nol. Kami melengkapi dengan mereka.
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:
- Klien Torrent Flud di tablet.
- QBittorent torrent client di PC.
- Naskah Lua