16 GB boş alana sahip bir tablet aracılığıyla 4 GB torrent indirme

16 GB boş alana sahip bir tablet aracılığıyla 4 GB torrent indirme

Sorun:

İnterneti olmayan bir PC var, ancak dosyayı USB üzerinden aktarmak mümkün. Bu dosyanın aktarılabileceği internete sahip bir tablet var. Gerekli torrenti tabletinize indirebilirsiniz, ancak yeterli boş alan yok. Torrentteki dosya tek ve büyüktür.

Çözüme giden yol:

İndirmek için torrenti başlattım. Boş alan neredeyse tükendiğinde indirmeyi duraklattım. Tableti PC'ye bağladım ve dosyayı tabletten PC'ye taşıdım. Duraklattım ve şaşırtıcı bir şekilde dosya yeniden oluşturuldu ve torrent sanki hiçbir şey olmamış gibi indirilmeye devam etti.

Torrent istemcisinin alınan verileri yazdığı dosyaya seyrek bayrağını koyması nedeniyle sistem tek seferde 16GB ayırmaya çalışmaz ve 4GB'ın üzerindeki bir dosyaya yazmaya çalışırken hata oluşmaz.

Prosedürü dört kez tekrarladıktan sonra bilgisayarıma aynı torrentin farklı bölümlerini içeren dört dosya aldım. Artık geriye bunları bir araya getirmek kalıyor. Prosedür esasen basittir. Dört dosyadan birinde belirli bir konumda mevcutsa sıfır baytı başka bir değerle değiştirmeniz gerekir.

Bana öyle geldi ki bu kadar basit bir program internette olmalı. Hiç kimse böyle bir sorunla karşılaşmadı mı? Ancak hangi anahtar kelimeleri arayacağımı bile bilmediğimi fark ettim. Bu nedenle bu görev için hızlı bir şekilde bir Lua betiği oluşturdum ve şimdi onu optimize ettim. Paylaşmak istediğim şey bu.

Torrenti parçalar halinde indirme

  1. torrenti ilk cihaza indirmeye başla
  2. ROM dolana kadar bekleyin
  3. indirmeyi duraklat
  4. dosyayı ikinci cihaza aktarın ve dosya adına bir sayı ekleyin
  5. dosya tamamen indirilene kadar ilk noktaya dönüyoruz

Parçaları tek dosyada birleştirme

Son kısım alındıktan sonra bunların tek bir dosyada toplanması gerekir.

Görev basit:

  1. Tüm bölümleri aynı anda okuma
  2. Eğer bir kısım konum sıfır bayt değilse, bunu çıkışa yazarız, aksi takdirde sıfır yazarız.

Fonksiyon merge_part bir dizi iş parçacığını kabul eder streams_in bunlardan bir kısmı boyutu okur buffer_length ve farklı iş parçacıklarından parçaların birleştirilmesinin sonucunu döndürür.

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
--[[

Fonksiyon string.gsub göreve uygundur çünkü içi sıfırlarla dolu parçaları bulacak ve kendisine verileni teslim edecektir.

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

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

string.gsub eşleşmenin bulunduğu konumu aktarmaz. Bu nedenle pozisyon için paralel bir arama yapıyoruz zero_string işlevi kullanma string.find. İlk sıfır baytı bulmak yeterlidir.

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

--[[

Şimdi eğer in_part için veriler var out_part onları kopyalayın.

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

Şundan kes: in_part sıfır dizisine karşılık gelen kısım.

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

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

В part veri var.

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

part sıfır dizisinden daha az olduğu ortaya çıktı. Bunlarla takviye edelim.

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

Sonuç

Böylece bu dosyayı bir PC'ye indirip birleştirebildik. Birleşme sonrasında torrent dosyasını tabletten çıkardım. Bilgisayarıma bir torrent istemcisi yükledim ve dosyayı onunla kontrol ettim.

Tablete en son indirilen parça dağıtımda bırakılabilir ancak bundan önce parçaların tekrar kontrol edilmesini etkinleştirmeniz ve tekrar indirilmemesi için dosyanın işaretini kaldırmanız gerekir.

Kullanılmış:

  1. Flud torrent istemcisi tablette.
  2. Torrent istemcisi qBittorent PC'de.
  3. Lua komut dosyası

Kaynak: habr.com

Yorum ekle