Λήψη torrent 16 GB μέσω tablet με 4 GB ελεύθερου χώρου

Λήψη torrent 16 GB μέσω tablet με 4 GB ελεύθερου χώρου

Εργασία:

Υπάρχει υπολογιστής χωρίς Internet, αλλά είναι δυνατή η μεταφορά του αρχείου μέσω USB. Υπάρχει ένα tablet με το Διαδίκτυο από το οποίο μπορεί να μεταφερθεί αυτό το αρχείο. Μπορείτε να κάνετε λήψη του απαιτούμενου torrent στο tablet σας, αλλά δεν υπάρχει αρκετός ελεύθερος χώρος. Το αρχείο στο torrent είναι ένα και μεγάλο.

Ο δρόμος προς τη λύση:

Ξεκίνησα το torrent για λήψη. Όταν ο ελεύθερος χώρος είχε σχεδόν φύγει, σταμάτησα τη λήψη. Συνέδεσα το tablet στον υπολογιστή και μετέφερα το αρχείο από το tablet στον υπολογιστή. Έκανα μια παύση και προς έκπληξή μου το αρχείο δημιουργήθηκε ξανά και το torrent συνέχισε να κατεβάζει σαν να μην είχε συμβεί τίποτα.

Λόγω του γεγονότος ότι ο πελάτης torrent ορίζει την αραιή σημαία στο αρχείο στο οποίο γράφει τα δεδομένα που έλαβε, το σύστημα δεν προσπαθεί να κρατήσει 16 GB ταυτόχρονα και δεν θα προκύψει σφάλμα κατά την προσπάθεια εγγραφής σε αρχείο άνω των 4 GB.

Αφού επανέλαβα τη διαδικασία τέσσερις φορές, έλαβα τέσσερα αρχεία στον υπολογιστή μου που περιείχαν διαφορετικά μέρη του ίδιου torrent. Τώρα το μόνο που μένει είναι να τα συνδυάσουμε. Η διαδικασία είναι ουσιαστικά απλή. Πρέπει να αντικαταστήσετε τα μηδενικά byte με μια άλλη τιμή εάν υπάρχει σε μια δεδομένη θέση σε ένα από τα τέσσερα αρχεία.

Μου φάνηκε ότι ένα τόσο απλό πρόγραμμα θα έπρεπε να υπάρχει στο Διαδίκτυο. Κανείς δεν αντιμετώπισε ποτέ τέτοιο πρόβλημα; Αλλά συνειδητοποίησα ότι δεν ξέρω καν ποιες λέξεις-κλειδιά να το ψάξω. Επομένως, δημιούργησα γρήγορα ένα σενάριο Lua για αυτήν την εργασία και τώρα το έχω βελτιστοποιήσει. Αυτό θέλω να μοιραστώ.

Λήψη torrent σε μέρη

  1. ξεκινήστε τη λήψη του torrent στην πρώτη συσκευή
  2. περιμένετε μέχρι να γεμίσει η ROM
  3. παύση της λήψης
  4. μεταφέρετε το αρχείο στη δεύτερη συσκευή και προσθέστε έναν αριθμό στο όνομα του αρχείου
  5. επιστρέφουμε στο πρώτο σημείο μέχρι να γίνει πλήρης λήψη του αρχείου

Συγχώνευση τμημάτων σε ένα αρχείο

Μετά τη λήψη του τελευταίου μέρους, είναι απαραίτητο να τα συγκεντρώσετε σε ένα ολόκληρο αρχείο.

Η εργασία είναι απλή:

  1. Διαβάζοντας όλα τα μέρη ταυτόχρονα
  2. Εάν σε κάποιο μέρος η θέση δεν είναι μηδενικό byte, τότε τη γράφουμε στην έξοδο, διαφορετικά γράφουμε μηδέν

Λειτουργία 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. Αρκεί να βρείτε το πρώτο μηδενικό byte.

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

Συμπέρασμα

Έτσι, μπορέσαμε να κατεβάσουμε και να συγκεντρώσουμε αυτό το αρχείο σε έναν υπολογιστή. Μετά τη συγχώνευση, έβγαλα το αρχείο torrent από το tablet. Εγκατέστησα ένα πρόγραμμα-πελάτη torrent στον υπολογιστή μου και έλεγξα το αρχείο με αυτό.

Το τελευταίο μέρος που κατεβάσατε στο tablet μπορεί να παραμείνει στη διανομή, αλλά πρέπει να ενεργοποιήσετε τον εκ νέου έλεγχο των εξαρτημάτων πριν από αυτό και να καταργήσετε την επιλογή του αρχείου, ώστε να μην γίνει ξανά λήψη.

Μεταχειρισμένος:

  1. Flud torrent πρόγραμμα-πελάτης σε tablet.
  2. Πελάτης torrent qBittorent σε υπολογιστή.
  3. Σενάριο Lua

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο