Многие . torrent файлы устарели сами по себе (например, велась раздача сериала путем добавления новых серий заменой . Теперь сам вопрос: есть ли способ автоматически (не вручную) установить соответствие между имеющимися на компьютере . Цель: удалить лишние (неактуальные) .
Если торренты в папке %APPDATA%\utorrent по каким-то причинам были . Допустим, вы хотите переустановить Windows, сохранив при этом все раздачи популярного торрент клиента uTorrent. Во-первых . Как восстановить торрент файлы при переустановке системы Windows. Как восстановить .
У кого какие идеи? Мне же этот вопрос показался интересным, и после возвращения из отпуска я нашел время, чтобы в нем разобраться. Потратив в общей сложности неделю на разбор формата . Прежде чем начать, стоит отметить несколько моментов: Получилось много, но не все.
По формату файла . Людей, чувствительных к временами некачественному коду, прошу меня заранее простить — я знаю, что многое можно было написать лучше, оптимальнее и безглючнее. Но мы же не ищем легких путей, да и предлагался такой вариант! Итак, будем решать задачу по сложному — не скачивать. Приступая к написанию любой программы, необходимо сначала продумать хотябы базовый алгоритм ее работы. В нашем случае алгоритм, по сути, состоит из двух шагов: Найти и прочитать все .
Найти в куче файлов тот, который соответствует описанному в . Прошерстив интернет по данному вопросу, я обнаружил несколько . NET- библиотек под это дело. Выбор свой я остановил на, более- менее понятной и работающей из коробки библиотеке Bencode. Library, однако впоследствии пришлось ее немного дополнить под свои нужды, но об этом позже.
Начнем с самого простого момента — чтения . Строение . torrent- файла довольно простое — он представляет из себя словарь в формате bencode. В данном словаре нас интересует только пара с ключом info — блок описания файлов. Этот тоже является словарем и содержит в себе информацию об имени файлов, их размере. Кроме того, как многим известно, торрент хеширует файлы не целиком, а по кускам определенной длины, которая зависит от размера этих файлов. Информация о размере этого куска также содержится в словаре info. Для хранения информации из прочитанного файла будем использовать такой класс Torrent: class Torrentpublic class Torrent.
Она составляется очень просто. Все файлы склеиваются в один (виртуально конечно) друг за другом, образуя при этом один БОЛЬШОООООООЙ воображаемый файл. В этом воображаемом файле берем кусок длины Piece. Length, считаем SHA1 хеш, кладем хеш в строку, берем следующий кусок, считаем хеш, дописываем к концу строки с хешем предыдущего куска. Вот она: class Lost. Filepublic class Lost.
File. . Кроме того этот класс содержит еще одно поле — Begin. From. Оно описывает начало этого файла в том БОЛЛЬШОООООМ воображаемом файле. Он нужен, чтобы взять правильную часть файла для подсчета хеша — ведь длина файла очень редко кратна длине куска. Подготовив структуры для хранения необходимой информации, можно приступать к их заполнению. С помощью найденной на просторах интернета библиотеки Bencode. Library мы читаем наш . List< Lost. File> files = new List< Lost.
File> (); // список файлов, понадобится позднее. BDict torrent = (BDict)Bencoding. Utils. Decode. File(filename, Encoding. UTF8). BDict file. Info = (BDict)torrent. Дело в том, что по спецификации все строки в . UFT8. Если читать хеш, который по спецификации записан в формате bencode- строки, как UTF8- строку, то возникнет проблема сравнения — хеши одинаковых кусков не совпадут.
Если в списке категорий и профиле раздач вы файлы видите, тогда всё в порядке. Но что делать, если там сплошные нули? Решений этой проблемы . Как удалить, переместитье, восстановить закачку раздачи BitTorrent, uTorrent - Duration: 5:54. Ограничения ставить необходимо, так как при раздаче/скачивании файлов, uTorrent не должен занимать весь интернет-канал - это негативно повлияет . При переустановке ОС Windows - раздачи в Utorrent не сохраняются. Кроссворд На Английском Языке С Ответами. Попробуем исправить этот момент.
Читая же торрент в предлагаемой кодировке codepage- 4. Выход из такой ситуации, которая меня тормознула на два дня, я нашел не лучший, но работающий — читать два раза в разных кодировках. BDict)Bencoding. Utils. Decode. File(filename, Encoding.
Get. Encoding(4. 37)). Это как раз тот момент, когда пришлось добавлять один метод в библиотеку — изначально codepage- 4. Мы добрались до самого интересного момента в этой части — чтение информации о файлах. Торрент файлы бывают двух типов. Эти типы различаются тем, сколько файлов в них описано. При описании только одного файла в . Сначала разберем .
Length = ((BInt)file. Info. В случае, когда файлов в раздаче много, то в поле name пишется имя папки, в которую их надо положить (на самом деле может быть что угодно, но почему- то все пишут имя папки в которой эти файлы лежали при создании). Кроме того появляется список files в котором содержится информация о каждом файле: путь к нему и размер. Если размер — просто целое число, то путь к файлу представляет собой список из строк (имен директорий), пройдя по которым мы увидим этот файл. Такое лучше пояснять на примере.
Для файлов level. Кроме того, надо хранить начало каждого файла в том БОЛЬШООООМ (не забыли, правда же?!): BList files.
Data = (BList)file. Info. Но порядок файлов в списке files будет точно таким же. Это ключевой момент для понимания принципа хеширования. Для примера, в ситуации, изображенной на первом рисунке, список файлов будет следующим: .
Таким образом, считая хеш одного файла, мы знаем какой файл надо будет брать следующим. Когда мы все это дело прочитали и посчитали — давайте создадим и вернем экземпляр Torrent: new Torrent(name, files, piece. Length, pieces, filename). Собирая теперь все чтение и разбор .
Read. Torrentstatic Torrent Read. Torrent(string filename). Для этого будем использовать метод Find. Files такого вида: void Find.
Files(Torrent torrent, List< File. Info> files, string destination. Path) . Так как проверка хеша довольно затратна, то надо сначала отсеять явно левые файлы.
Ну посудите сами: если я качал дискографию в . Имя мог поменять, а вот расширение вряд ли. File. Info file. On. Disk = files. Только после того, как мы отсеяли по расширению явно левые файлы, можно приступать к проверке хеша. Перед перемещением будем естественно проверять наличие директории, а также проверим есть ли уже такой файл или нет. Начну с двух последних — вот эти строки. Remove(file. On. Disk).
Files. Remove. At(i- -). Я посчитал вполне логичным убирать уже отсортированные файлы из рассмотрения, что позволит несколько сократить время выполнения поиска.
Во второй строке есть конструкция . Remove. At(i- -); так как из коллекции убирается текущий элемент, то указатель надо сдвинуть назад, чтобы на следующей итерации цикла брался следующий элемент, а не через один. Теперь про первый момент. Я знаю про наличие foreach для списка, но его при использовании нельзя модифицировать этот спикок, то есть мы не сможем удалять уже ненужные более элементы.
Итак, собирая все выше описанное в один метод, имеем: Read. Torrent. public static void Find. Files(Torrent torrent, List< File. Info> files, string destination. Path, bool copy. File). Самое вкусное. Проверка хеша.
Как видно из кода выше, для проверки хеша мы передаем имя файла на диске и номер файла в списке файлов торрента. Это надо для того, чтобы не запускать поиск в списке файлов, а сразу взять его по номеру, раз он известен (еще одно . На данном этапе мы знаем номер в списке файлов торрента и путь до файла на диске. Lost. File checking. File = this. Files. Мы будем браться только за файлы, длина которых больше или равна Piece.
Length * 2 - 1. Такое ограничение даст нам возможность вычленить хотя бы один кусок для проверки, полность находящийся в файле.
Восстановление раздач Bit. Torrent, u. Torrent - You. Tube. Завантаження списк.