Mengunduh torrent 16GB melalui tablet dengan ruang kosong 4GB

Mengunduh torrent 16GB melalui tablet dengan ruang kosong 4GB

Tugas:

Ada PC tanpa Internet, tetapi dimungkinkan untuk mentransfer file melalui USB. Ada tablet dengan Internet tempat file ini dapat ditransfer. Anda dapat mengunduh torrent yang diperlukan di tablet Anda, tetapi ruang kosong tidak cukup. File di torrent itu satu dan besar.

Jalan menuju solusi:

Saya memulai torrent untuk mengunduh. Ketika ruang kosong hampir habis, saya menghentikan sementara pengunduhan. Saya menghubungkan tablet ke PC dan memindahkan file dari tablet ke PC. Saya berhenti sejenak dan yang mengejutkan saya, file tersebut dibuat lagi dan torrent terus diunduh seolah-olah tidak terjadi apa-apa.

Karena kenyataan bahwa klien torrent menyetel tanda sparse ke file tempat ia menulis data yang diterima, sistem tidak mencoba mencadangkan 16 GB sekaligus dan kesalahan tidak akan terjadi saat mencoba menulis ke file yang melebihi 4 GB.

Setelah mengulangi prosedur ini empat kali, saya menerima empat file di PC saya yang berisi bagian berbeda dari torrent yang sama. Sekarang yang tersisa hanyalah menyatukannya. Prosedurnya pada dasarnya sederhana. Anda perlu mengganti byte nol dengan nilai lain jika nilai tersebut ada pada posisi tertentu di salah satu dari empat file.

Bagi saya, program sederhana seperti itu seharusnya ada di Internet. Apakah tidak ada yang pernah mengalami masalah seperti itu? Namun saya menyadari bahwa saya bahkan tidak tahu kata kunci apa yang harus dicari untuk itu. Oleh karena itu, saya segera membuat skrip Lua untuk tugas ini dan sekarang saya telah mengoptimalkannya. Inilah yang ingin saya bagikan.

Mengunduh torrent sebagian

  1. mulai mengunduh torrent di perangkat pertama
  2. tunggu sampai ROM terisi
  3. jeda pengunduhan
  4. transfer file ke perangkat kedua dan tambahkan nomor ke nama file
  5. kita kembali ke poin pertama sampai file terdownload sepenuhnya

Menggabungkan bagian-bagian menjadi satu file

Setelah bagian terakhir diterima, perlu untuk mengumpulkannya menjadi satu file utuh.

Tugasnya sederhana:

  1. Membaca semua bagian sekaligus
  2. Jika di beberapa bagian posisinya bukan byte nol, maka kita tuliskan ke output, jika tidak kita tulis nol

Fungsi merge_part menerima serangkaian utas streams_in yang bertuliskan sebagian ukuran buffer_length dan mengembalikan hasil penggabungan bagian-bagian dari utas 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("[^ ]")   -- есть данные в in_part
                and out_part:find(" ", 1, true) -- есть пустые места в out_part
            then 
                local find_index = 1
--[[

Fungsi string.gsub cocok untuk tugas tersebut karena ia akan menemukan potongan yang berisi angka nol dan memberikan apa yang diberikan padanya.

--]]
                out_part = out_part:gsub(" +", function(zero_string)

                    if #in_part < find_index then
                        return -- не на что менять
                    end
--[[

string.gsub tidak menyampaikan posisi di mana kecocokan itu ditemukan. Oleh karena itu, kami melakukan pencarian paralel untuk posisi tersebut zero_string menggunakan fungsi string.find. Cukup dengan menemukan byte nol pertama.

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

--[[

Sekarang jika masuk in_part ada data untuk out_part salin mereka.

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

Potong dari in_part bagian yang sesuai dengan urutan angka nol.

--]]
                        local part = in_part:sub(start_index, end_index)

                        if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[

В part ada data.

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

part ternyata kurang dari barisan angka nol. Mari kita lengkapi 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, kami dapat mengunduh dan merakit file ini di PC. Setelah penggabungan, saya mengeluarkan file torrent dari tablet. Saya memasang klien torrent di PC saya dan memeriksa file dengannya.

Bagian yang terakhir diunduh di tablet dapat dibiarkan di distribusi, tetapi Anda harus mengaktifkan pemeriksaan ulang bagian-bagian tersebut sebelum ini dan menghapus centang pada file agar tidak diunduh lagi.

Digunakan:

  1. Klien torrent Flud di tablet.
  2. Klien torrent qBittorent di PC.
  3. skrip Lua

Sumber: www.habr.com

Tambah komentar