Tải xuống torrent 16GB qua máy tính bảng có 4GB dung lượng trống

Tải xuống torrent 16GB qua máy tính bảng có 4GB dung lượng trống

Thử thách:

Có PC không có Internet nhưng có thể truyền file qua USB. Có một máy tính bảng có Internet mà từ đó tập tin này có thể được truyền đi. Bạn có thể tải xuống torrent cần thiết trên máy tính bảng của mình nhưng không có đủ dung lượng trống. Tệp trong torrent là một và lớn.

Đường dẫn đến giải pháp:

Tôi đã bắt đầu tải torrent. Khi dung lượng trống gần hết, tôi tạm dừng tải xuống. Tôi đã kết nối máy tính bảng với PC và chuyển tệp từ máy tính bảng sang PC. Tôi tạm dừng và thật ngạc nhiên là tệp đã được tạo lại và torrent tiếp tục tải xuống như không có chuyện gì xảy ra.

Do máy khách torrent đặt cờ thưa thớt cho tệp mà nó ghi dữ liệu đã nhận nên hệ thống không cố gắng dự trữ 16GB cùng một lúc và sẽ không xảy ra lỗi khi cố gắng ghi vào tệp vượt quá 4GB.

Sau khi lặp lại quy trình bốn lần, tôi nhận được bốn tệp trên PC chứa các phần khác nhau của cùng một torrent. Bây giờ tất cả những gì còn lại là đặt chúng lại với nhau. Thủ tục về cơ bản là đơn giản. Bạn cần thay thế các byte XNUMX bằng một giá trị khác nếu nó tồn tại ở một vị trí nhất định ở một trong bốn tệp.

Đối với tôi, có vẻ như một chương trình đơn giản như vậy nên có trên Internet. Có ai từng gặp phải vấn đề như vậy chưa? Nhưng tôi nhận ra rằng tôi thậm chí còn không biết nên tìm kiếm từ khóa nào. Vì vậy, tôi đã nhanh chóng tạo tập lệnh Lua cho tác vụ này và hiện tại tôi đã tối ưu hóa nó. Đây là những gì tôi muốn chia sẻ.

Tải torrent theo từng phần

  1. bắt đầu tải torrent trên thiết bị đầu tiên
  2. đợi cho đến khi đầy rom
  3. tạm dừng tải xuống
  4. chuyển file sang thiết bị thứ hai và thêm số vào tên file
  5. chúng ta quay lại điểm đầu tiên cho đến khi tải xong file

Hợp nhất các phần thành một tập tin

Sau khi nhận được phần cuối cùng, cần phải thu thập chúng thành một tập tin hoàn chỉnh.

Nhiệm vụ rất đơn giản:

  1. Đọc tất cả các phần cùng một lúc
  2. Nếu ở một phần nào đó vị trí không phải là byte XNUMX thì chúng ta ghi nó vào đầu ra, nếu không thì chúng ta ghi XNUMX

Chức năng merge_part chấp nhận một loạt các chủ đề streams_in trong đó đọc một phần kích thước buffer_length và trả về kết quả của việc hợp nhất các phần từ các luồng khác nhau.

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

Chức năng string.gsub phù hợp với nhiệm vụ vì nó sẽ tìm những mảnh chứa đầy số không và cung cấp những gì được giao cho nó.

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

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

string.gsub không truyền đạt vị trí mà kết quả khớp được tìm thấy. Vì vậy, chúng tôi thực hiện tìm kiếm song song cho vị trí zero_string sử dụng chức năng string.find. Chỉ cần tìm byte XNUMX đầu tiên là đủ.

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

--[[

Bây giờ nếu ở in_part có dữ liệu cho out_part sao chép chúng.

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

Cắt từ in_part phần tương ứng với dãy số XNUMX.

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

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

В part có dữ liệu.

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

part hóa ra là ít hơn một dãy số không. Hãy bổ sung nó với họ.

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

Kết luận

Vì vậy, chúng tôi đã có thể tải xuống và tập hợp tệp này trên PC. Sau khi hợp nhất, tôi lấy tệp torrent ra khỏi máy tính bảng. Tôi đã cài đặt một máy khách torrent trên PC của mình và kiểm tra tệp bằng nó.

Phần được tải xuống lần cuối trên máy tính bảng có thể được để lại trên bản phân phối, nhưng bạn cần kích hoạt tính năng kiểm tra lại các phần trước đó và bỏ chọn tệp để nó không tải xuống lại.

Được sử dụng:

  1. Flud torrent client trên máy tính bảng.
  2. Máy khách torrent qBittorent trên PC.
  3. Tập lệnh Lua

Nguồn: www.habr.com

Thêm một lời nhận xét