16GBの空き容量を持つタブレット経由で4GBのトレントをダウンロードする

16GBの空き容量を持つタブレット経由で4GBのトレントをダウンロードする

タスク:

インターネットのないPCもありますが、USB経由でファイルを転送することは可能です。 インターネットに接続されたタブレットがあり、そこからこのファイルを転送できます。 必要なトレントをタブレットにダウンロードできますが、十分な空き容量がありません。 torrent 内のファイルは XNUMX つで、サイズが大きくなります。

解決への道筋:

トレントをダウンロードして始めました。 空き容量がほぼなくなったとき、ダウンロードを一時停止しました。 タブレットをPCに接続し、タブレットからPCにファイルを移動しました。 一時停止すると、驚いたことにファイルが再び作成され、何事もなかったかのように torrent のダウンロードが続行されました。

torrent クライアントは受信したデータを書き込むファイルにスパース フラグを設定するため、システムは一度に 16 GB を予約しようとはせず、4 GB を超えるファイルに書き込もうとしてもエラーは発生しません。

この手順を XNUMX 回繰り返した後、同じ torrent の異なる部分を含む XNUMX つのファイルを PC 上に受信しました。 あとはそれらを組み合わせるだけです。 手順は基本的に簡単です。 XNUMX つのファイルのいずれかの特定の位置にゼロ バイトが存在する場合は、そのバイトを別の値に置き換える必要があります。

このような単純なプログラムがインターネット上にあるべきだと私には思えました。 このような問題に遭遇した人はいないでしょうか? でも、どんなキーワードで検索すればいいのかもわからないことに気づきました。 したがって、このタスク用の Lua スクリプトをすぐに作成し、最適化しました。 これが私が共有したいことです。

torrent を部分的にダウンロードする

  1. 最初のデバイスで torrent のダウンロードを開始します
  2. ROMがいっぱいになるまで待ちます
  3. ダウンロードを一時停止する
  4. ファイルを XNUMX 番目のデバイスに転送し、ファイル名に数字を追加します
  5. ファイルが完全にダウンロードされるまで最初のポイントに戻ります

パーツを XNUMX つのファイルに結合する

最後の部分を受信したら、それらを XNUMX つのファイル全体に収集する必要があります。

タスクは簡単です。

  1. すべての部分を一度に読む
  2. 一部の位置がゼロバイトでない場合は、それを出力に書き込みます。そうでない場合は、ゼロを書き込みます。

機能 merge_part スレッドの配列を受け入れます streams_in サイズの一部を読み取ります buffer_length 異なるスレッドからのパーツをマージした結果を返します。

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

機能 string.gsub は、ゼロで埋められた部分を見つけて、与えられたものを提供するため、タスクに適しています。

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

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

string.gsub 一致が見つかった位置は伝えられません。 したがって、位置の並列検索を実行します。 zero_string 関数を使用して string.find。 最初のゼロバイトを見つけるだけで十分です。

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

--[[

今なら in_part のデータがあります out_part それらをコピーしてください。

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

から切り取る in_part ゼロの連続に相当する部分。

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

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

В part データがあります。

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

part 一連のゼロ未満であることが判明しました。 それらを使って補足しましょう。

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

まとめ

したがって、このファイルを PC にダウンロードして組み立てることができました。 合併後、タブレットからtorrentファイルを取り出しました。 PC に torrent クライアントをインストールし、それでファイルを確認しました。

タブレット上で最後にダウンロードした部分はディストリビューション上に残すことができますが、それより前の部分の再チェックを有効にし、再度ダウンロードされないようにファイルのチェックを外す必要があります。

使用済み:

  1. タブレット上の Flud torrent クライアント。
  2. PC 上のトレント クライアント qBittorent。
  3. Lua スクリプト

出所: habr.com

コメントを追加します