Memuat turun torrent 16GB melalui tablet dengan 4GB ruang kosong

Memuat turun torrent 16GB melalui tablet dengan 4GB ruang kosong

Tugas:

Terdapat PC tanpa Internet, tetapi adalah mungkin untuk memindahkan fail melalui USB. Terdapat tablet dengan Internet dari mana fail ini boleh dipindahkan. Anda boleh memuat turun torrent yang diperlukan pada tablet anda, tetapi ruang kosong tidak mencukupi. Fail dalam torrent adalah satu dan besar.

Laluan kepada penyelesaian:

Saya memulakan torrent untuk memuat turun. Apabila ruang kosong hampir hilang, saya menjeda muat turun. Saya menyambungkan tablet ke PC dan mengalihkan fail dari tablet ke PC. Saya berhenti seketika dan mengejutkan saya fail itu dicipta semula dan torrent terus memuat turun seolah-olah tiada apa-apa yang berlaku.

Disebabkan oleh fakta bahawa klien torrent menetapkan bendera jarang pada fail di mana ia menulis data yang diterima, sistem tidak cuba untuk menempah 16GB sekaligus dan ralat tidak akan berlaku apabila cuba menulis ke fail melebihi 4GB.

Selepas mengulangi prosedur empat kali, saya menerima empat fail pada PC saya yang mengandungi bahagian berlainan torrent yang sama. Sekarang yang tinggal hanyalah menyatukan mereka. Prosedurnya pada asasnya mudah. Anda perlu menggantikan bait sifar dengan nilai lain jika ia wujud pada kedudukan tertentu dalam salah satu daripada empat fail.

Ia seolah-olah saya bahawa program mudah sedemikian harus ada di Internet. Tidak ada yang pernah mengalami masalah seperti itu? Tetapi saya menyedari bahawa saya tidak tahu apa kata kunci untuk mencarinya. Oleh itu, saya dengan cepat mencipta skrip Lua untuk tugasan ini dan kini saya telah mengoptimumkannya. Ini yang saya nak kongsikan.

Memuat turun torrent dalam bahagian

  1. mula memuat turun torrent pada peranti pertama
  2. tunggu sehingga ROM diisi
  3. jeda muat turun
  4. pindahkan fail ke peranti kedua dan tambahkan nombor pada nama fail
  5. kita kembali ke titik pertama sehingga fail dimuat turun sepenuhnya

Menggabungkan bahagian menjadi satu fail

Selepas bahagian terakhir telah diterima, adalah perlu untuk mengumpulnya ke dalam satu fail keseluruhan.

Tugasnya mudah:

  1. Membaca semua bahagian sekaligus
  2. Jika di beberapa bahagian kedudukannya bukan bait sifar, maka kita menulisnya ke output, jika tidak, kita menulis sifar

Fungsi merge_part menerima pelbagai utas streams_in yang membaca sebahagian daripada saiz buffer_length dan mengembalikan hasil penggabungan bahagian daripada benang yang berbeza.

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 sesuai untuk tugas itu kerana ia akan mencari kepingan yang diisi dengan sifar dan menyampaikan apa yang diberikan kepadanya.

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

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

string.gsub tidak menyampaikan kedudukan di mana perlawanan itu ditemui. Oleh itu, kami melakukan carian selari untuk kedudukan tersebut zero_string menggunakan fungsi tersebut string.find. Ia cukup untuk mencari bait sifar pertama.

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

--[[

Sekarang jika masuk in_part terdapat data untuk out_part salin mereka.

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

Potong daripada in_part bahagian yang sepadan dengan urutan sifar.

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

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

В part terdapat data.

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

part ternyata kurang daripada urutan sifar. Jom tambahkan dengan mereka.

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

Kesimpulan

Oleh itu, kami dapat memuat turun dan memasang fail ini pada PC. Selepas penggabungan, saya mengeluarkan fail torrent daripada tablet. Saya memasang klien torrent pada PC saya dan menyemak fail dengannya.

Bahagian terakhir yang dimuat turun pada tablet boleh dibiarkan pada pengedaran, tetapi anda perlu mendayakan penyemakan semula bahagian sebelum ini dan nyahtanda fail supaya ia tidak dimuat turun semula.

Digunakan:

  1. Pelanggan torrent Flud pada tablet.
  2. Pelanggan Torrent qBittorent pada PC.
  3. Skrip Lua

Sumber: www.habr.com

Tambah komen