Как удалить файл с торрента

Обновлено: 04.07.2024

Не так давно, а именно 5 июня хабрачеловек по имени alan008 задал вопрос. Чтобы не заставлять ходить за подробностями, приведу его здесь:

За несколько лет с разных трекеров (преимущественно c rutracker'а) разными клиентами (преимущественно uTorrent'ом) скачано много гигабайт разного полезного контента. Скачанные файлы впоследствии вручную перемещались с одного диска на другой, uTorrent их соответственно не видит. Многие .torrent файлы устарели сами по себе (например, велась раздача сериала путем добавления новых серий заменой .torrent файла).

Теперь сам вопрос: есть ли способ автоматически (не вручную) установить соответствие между имеющимися на компьютере .torrent файлами и содержимым, раскиданным по разным логическим дискам компьютера? Цель: удалить лишние (неактуальные) .torrent файлы, а для актуальных — поставить всё на раздачу. У кого какие идеи? :)

При необходимости (если это требуется) можно снова поместить все файлы данных в один каталог на одном логическом диске.

В обсуждениях сошлись на том, что если это и можно сделать, то только ручками. Мне же этот вопрос показался интересным, и после возвращения из отпуска я нашел время, чтобы в нем разобраться.

Потратив в общей сложности неделю на разбор формата .torrent-файла, поиск нормально работающей библиотеки для его парсинга, я приступил к написанию программы, которая позволит решить проблему затронутую в упомянутом вопросе.

  1. Получилось много, но не все.
  2. По формату файла .torrent будут даны лишь необходимые пояснения.
  3. Людей, чувствительных к временами некачественному коду, прошу меня заранее простить — я знаю, что многое можно было написать лучше, оптимальнее и безглючнее.

В данном случае имеется отличный способ решения — перекачать заново. Но мы же не ищем легких путей, да и предлагался такой вариант! Итак, будем решать задачу по сложному — не скачивать.

Приступая к написанию любой программы, необходимо сначала продумать хотябы базовый алгоритм ее работы. В нашем случае алгоритм, по сути, состоит из двух шагов:

  1. Найти и прочитать все .torrent-файлы;
  2. Найти в куче файлов тот, который соответствует описанному в .torrent, и переместить его в папку, соответствующую пути в .torrent.

Ну что же, приступим к решению поставленной задачи.

Ищем торренты и читаем их

Начнем с самого простого момента — чтения .torrent.

Строение .torrent-файла довольно простое — он представляет из себя словарь в формате bencode. В данном словаре нас интересует только пара с ключом info — блок описания файлов. Этот тоже является словарем и содержит в себе информацию об имени файлов, их размере. Кроме того, как многим известно, торрент хеширует файлы не целиком, а по кускам определенной длины, которая зависит от размера этих файлов. Информация о размере этого куска также содержится в словаре info.

Для хранения информации из прочитанного файла будем использовать такой класс Torrent :

Здесь поля хранят следующую информацию:

* Name — имя торрента (вообще говоря — имя папки или имя файла)
* Files — список файлов, которые нам надо будет в дальнейшем искать
* PieceLength — размер тех самых кусочков, хеш которых нам предстоит считать
* Hash — хеш строка всех файлов
* FileName — имя .torrent-файла на диске

Теперь стоит заострить внимание на строке хеша. Она составляется очень просто. Все файлы склеиваются в один (виртуально конечно) друг за другом, образуя при этом один БОЛЬШОООООООЙ воображаемый файл. В этом воображаемом файле берем кусок длины PieceLength , считаем SHA1 хеш, кладем хеш в строку, берем следующий кусок, считаем хеш, дописываем к концу строки с хешем предыдущего куска. Т. е. это обычная конкатенация хешей всех кусков.


Как мог заметить внимательный читатель, файл внутри класса — это не просто файл, а особый тип данных, в котором файл описывается некой конструкцией типа LostFile . Вот она:

Здесь все просто: имя файла и его размер. Кроме того этот класс содержит еще одно поле — BeginFrom . Оно описывает начало этого файла в том БОЛЛЬШОООООМ воображаемом файле. Он нужен, чтобы взять правильную часть файла для подсчета хеша — ведь длина файла очень редко кратна длине куска.


Подготовив структуры для хранения необходимой информации, можно приступать к их заполнению.

С помощью найденной на просторах интернета библиотеки BencodeLibrary мы читаем наш .torrent-файл и выкорчевываем из него блок info:


Далее из этого блока необходимо забрать данные об имени торрента, размере куска.


В этом месте мы передаем в метод `BencodingUtils.DecodeFile` вторым параметром информацию о кодировке. Это как раз тот момент, когда пришлось добавлять один метод в библиотеку — изначально codepage-437 была вшита в код.

Мы добрались до самого интересного момента в этой части — чтение информации о файлах. Торрент файлы бывают двух типов. Эти типы различаются тем, сколько файлов в них описано. При описании только одного файла в .torrent пишется его имя и размер.

Сначала разберем .torrent с описанием одного файла.


Тут все просто — имя торрента совпадает с именем файла. В случае, когда файлов в раздаче много, то в поле name пишется имя папки, в которую их надо положить (на самом деле может быть что угодно, но почему-то все пишут имя папки в которой эти файлы лежали при создании). Кроме того появляется список files в котором содержится информация о каждом файле: путь к нему и размер. Если размер — просто целое число, то путь к файлу представляет собой список из строк (имен директорий), пройдя по которым мы увидим этот файл.

Такое лучше пояснять на примере. Для файлов level_1\level_2_1\file_1.txt и level_1\level_2_2\file_2.txt , если мы захотим их раздавать, поле name будет содержать имя папки верхнего уровня ( "level_1" ), а список path для одного из файлов будет следующего вида: и для другого.

Нам для .torrent с несколькими файлами надо путь до каждого файла собрать в одну строку. Кроме того, надо хранить начало каждого файла в том БОЛЬШООООМ (не забыли, правда же?!):

Очень важно отметить, что порядок следования файлов в БОЛЬШОООООМ файле может быть любым, не обязательно по алфавиту или по размеру. Но порядок файлов в списке files будет точно таким же. Это ключевой момент для понимания принципа хеширования. Для примера, в ситуации, изображенной на первом рисунке, список файлов будет следующим: . Таким образом, считая хеш одного файла, мы знаем какой файл надо будет брать следующим.

Когда мы все это дело прочитали и посчитали — давайте создадим и вернем экземпляр Torrent :


Собирая теперь все чтение и разбор .torrent-файла воедино, получаем:

Теперь, когда у нас есть все необходимые данные, мы готовы к самому интересному — поиску наших файлов.

Ищем файлы

Мы вплотную подошли к реализации второго шага нашего алгоритма. Для этого будем использовать метод FindFiles такого вида:


Здесь files — список файлов, среди которых мы будем искать, destinationPath — путь до папки назначения, в которую будут помещаться найденные файлы.

Для каждого файла в .torrent мы будем перебирать все файлы из кучи и их сверять. Так как проверка хеша довольно затратна, то надо сначала отсеять явно левые файлы. Ну посудите сами: если я качал дискографию в .mp3 и переместил ее, то явно не менял расширения файлов. Имя мог поменять, а вот расширение вряд ли.


Также стоит проверять длину файла, но это уже сомнительно и иногда может давать ложные срабатывания. Только после того, как мы отсеяли по расширению явно левые файлы, можно приступать к проверке хеша.


После того как проверка завершена, и мы удостоверились в соответствии файла искомому — перемещаем его в папку назначения с правильным путем. Перед перемещением будем естественно проверять наличие директории, а также проверим есть ли уже такой файл или нет. copyFile — переменная передаваемая с формы пользователем, ее назначение, я думаю, понятно всем.


Есть в коде выше три важных для пояснения момента. Начну с двух последних — вот эти строки:


Я посчитал вполне логичным убирать уже отсортированные файлы из рассмотрения, что позволит несколько сократить время выполнения поиска. Во второй строке есть конструкция .RemoveAt(i--); так как из коллекции убирается текущий элемент, то указатель надо сдвинуть назад, чтобы на следующей итерации цикла брался следующий элемент, а не через один.

Теперь про первый момент. Я знаю про наличие foreach для списка, но его при использовании нельзя модифицировать этот спикок, то есть мы не сможем удалять уже ненужные более элементы. Итак, собирая все выше описанное в один метод, имеем:

Ну вот! Самое вкусное.

Проверка хеша

Как видно из кода выше, для проверки хеша мы передаем имя файла на диске и номер файла в списке файлов торрента. Это надо для того, чтобы не запускать поиск в списке файлов, а сразу взять его по номеру, раз он известен (еще одно "+1" циклу for ).


Теперь приступим к реализации нашего метода проверки хеша. На данном этапе мы знаем номер в списке файлов торрента и путь до файла на диске

  1. Нет необходимости дополнительно искать на диске соседние файлы;
  2. Длина куска для хеширования очень редко превышает 2-4 МБ, что дает нам еще один плюс — с точки зрения производительности и времени, докачать такие файлы намного проще, чем искать их на диске.

Когда торрент-клиент проводит хеширование файлов, он считает хеш по порядку, однако бывает так, что нет одного или нескольких файлов. Тогда торрент-клиенту надо знать какой следующий кусок брать и откуда он будет начинаться в следующем имеющемся файле. Для вычисления двух этих цифр будем использовать следующий код, в котором переменная firstChunkNumber содержит номер первого куска, который полностью содержится в данном файле, а bytesOverhead — количество байт от начала файла до начала этого куска. Для лучшего понимания этого момента взгляните на поясняющий рисунок после кода.


Ответить на вопрос «Почему номер куска разный для случая, когда его начало совпадает с началом файла, и для случая, когда кусок лежит внутри?» предлагается самостоятельно.

Сейчас, зная номер куска мы должны взять его хеш из торрента с помощью такой конструкции:


После этого, надо прочитать кусок из файла и посчитать его хеш:


Ну и самое важное — его проверить. У меня, почему-то не захотел работать ни один из методов Equals() , которые я смог найти, поэтому проверяем так:


Собирая воедино сие творение возбужденного мозга, получим метод следующего содержания:

На этой прекрасной ноте, рассказ о методах и алгоритмах заканчивается, и мы переходим к рассказу о реализации в реальной жизни данного творения. Вполне понятно, что данная задача мной решалась не для того, чтобы решить, а для того, чтобы реализовать. Поэтому привожу на суд общественности мое творение, которое реализует все то, о чем написано выше.

Программа

В процессе работы, после окончания обработки очередного файла, выводится результат — имя .torrent-файла на диске и количество обработанных файлов.


Чтобы запустить сканирование, необходимо выбрать три директории (с файлами .torrent, с файлами для сортировки и папку для отсортированного), по желанию указать две опции и запустить сканирование.

По поводу производительности. Она пока что низкая: обработка 10 больших torrent-файлов заняла около 5 минут.

Так как работает приложение в один поток, то во время выполнения интерфейс подвисает, но я над этим работаю. Также хочу напомнить, что файлы малого размера (меньше 2-х мегабайт) не будут перемещены по причине отсутствия возможности проверки хеша. Вполне вероятны ложные срабатывания из-за того, что проверяется только один кусок под номером firstChunkNumber . Пока что проверять все куски слишком затратно, но в планах есть.

Не ищите торренты рекурсивно, если они собраны в корне диска.
Копирование может занять много времени, поэтому интерфейс может подвиснуть — не пугайтесь.

Так как писалась эта программа 4fun, то качество кода там немного не то, которое хотелось бы, но у меня оно работает. Данная программа не тестировалась, исправлялись только очевидные ошибки, поэтому могут быть, да что скрывать-то, есть скрытые баги. ИСПОЛЬЗУЯ ДАННУЮ ПРОГРАММУ, ВЫ ИСПОЛЬЗУЕТЕ ЕЕ НА СВОЙ СТРАХ И РИСК.

Взять исходники можно на github. Распространяется по GPLv2. Там есть архив с исполняемым файлом. Для работы требуется библиотека Bencode Library, но не оригинальная, а модифицированная мною (есть у меня в репозитарии, подключена субмодулем).

Спасибо всем, кто проявил терпение и дочитал эту статью до конца. Рад услышать ваши вопросы, приветствуется всевозможная помощь в совершенствовании алгоритма и, в особенности, кода.

UPD1. По результатам обсуждения мне стало понятно, что правильней будет не ломать существующие коллекции выдергиванием файлов на раздачу, а наоборот — создавать хардлинки в нужном для раздачи месте на файлы внутри упорядоченных коллекций (фильмо и дискографий, например). В дальнейшем программа будет работать именно так.

UPD2. Если у тех, кто пользовался этой утилитой, есть еще какие-то пожелания по функционалу или баг репорты, то прошу оставлять их на github в issue-трекере.





Торрент-клиент — программа, поддерживающая сетевой протокол BitTorrent, предназначенный для быстрого скачивания файлов. Она является неотъемлемой частью «джентельменского набора» программ с пометкой «респект!». Некоторые пользователи настолько привыкли к комфорту технологии «торрент», что вообще с трудом представляют себе Интернет без её участия (то есть сети BitTorrent).
Однако иногда возникает необходимость удалить торрент (файл, координирующий сетевые подключения через трекер) или торрент-клиент (системное приложение). Рассмотрим подробно на примере популярного клиента uTorrent, как корректно выполнить эти действия.

Как удалить файлы встроенными средствами Windows

Процесс удаления файлов без использования специальных программ не сопровождается большими сложностями. Для этого мне достаточно в диспетчере задач найти рабочие процессы и завершить их. На все действия уйдет не больше нескольких минут.

Удаление файла с помощью завершения процесса в диспетчере задач

В Windows 7 запуск диспетчера осуществляется через комбинацию ALT+CTRL+DELETE. В новых версиях операционной системы используется сочетание клавиш Win + X.


Например, вот этот процесс

Алгоритм проведения процесса имеет следующий вид.

  1. Захожу в диспетчер задач и нахожу процесс, который необходимо удалить.
  2. Когда файл занят программой chrome.exe, запускаю командную строку и использую права админа. Чтобы открыть командную строку с правами администратора, вам необходимо ввести в поисковую строку Windows название программы. Когда она высветится в результатах поиска, необходимо нажать на нее правой кнопкой мыши и выбрать «Запустить от имени администратора».
  3. Сняв задачу в диспетчере, ввожу в командной строке команду del полный_путь_к_файлу, чтобы удалить его.
  4. Для возвращения нормального вида заново запускаю chrome.exe. В диспетчере задач выбираю файл → новая задача→ chrome.exe.

Новая задача в диспетчере задач

Создаем новую задачу

Удаление файла или папки в безопасном режиме

  • Во время включения компьютера до загрузки системы жму на клавишу F8. Лучше нажать на нее несколько раз.
  • На экране появится окно с выбором параметров загрузки. Выбираем «Безопасный режим». На экране появится окно с выбором параметров загрузки. Выбираем «Безопасный режим». Попав в него, переносим ненужны файл или папку в корзину.

Включение безопасного режима

Удаление файла после получения прав администратора

Бывает так, что удалить файл не получается из-за недостаточных прав пользователя. Оптимальным вариантом является использование командной строки для предоставления учетной записи права администратора. Я придерживаюсь следующего алгоритма:

  • Нажимаю по области «Пуск» и ввожу запрос «cmd», запускаю строку от имени администратора.

cmd от имени администратора

Именно от имени администратора

  • Жду загрузки экрана командной строки и появления мигающего курсора. Далее ввожу специальную команду net user administrator / active: yes. В конце нажимаю клавишу Enter.


Команду можно скопировать и вставить

  • В конце перезагружаю персональный компьютер и удаляю ненужный файл.

Простым вариантом является использование системных настроек для предоставления прав администратора. В таком режиме я удаляю любые файлы. Алгоритм действий имеет следующий вид:

  1. В поисковой строке (меню «Пуск») ищу раздел учетной записи пользователей.

Учетные записи пользователей

Переходим в этот раздел

  1. Перехожу в подраздел Управления учетной записью.

Управление учетной записью

Управление другой учетной записью

  1. Перейдя по вкладке, попадаю в список всех учетных записей на компьютере. Здесь выбираю тип доступа в режиме Admin.

Администратор учетная запись

Администратором может стать каждый

Предоставление административных прав помогает в удалении любых файлов. Теперь я не буду тратить много времени на чистку ПК от ненужной информации.

Выборочное удаление торрентов

1. Откройте программу uTorrent.

2. Кликните правой кнопкой в списке раздач по торренту, от которого необходимо избавиться.

удаление торрент-файла

3. В контекстном меню приложения выберите функцию «Удалить выборочно».

4. В подменю выберите приемлемый вариант удаления:

  • «только торрент-файл» — удалится только элемент из списка, а скачанный контент (ПО, игры, фильмы) останется на винчестере ПК;
  • «… и загруженные файлы» — полностью удаляться скачанные данные и торрент-файл;
  • «только загруженные данные» — контент исчезнет, а торрент по-прежнему будет в списке клиента.

Что может мешать удалению файлов?

Необходимые права в системе нужны для изменения файлов и папок. Без этого удаление информации невозможно. Причиной выступают настройки, которые сделаны админом компьютера. За много лет практической работы на компьютере я систематизировал причины проблемы.

  1. Нет прав доступа к файлу и папке. В настройках объекта находится ограничение на доступ к информации. Для изменения прав я кликаю по файлу правой кнопкой мыши (свойства → безопасность).

Нет прав доступа к файлу и папке

Изменение прав доступа

    Данные заняты другим процессом. Я выключаю программы, в которых задействован файл. Далее повторяю операцию удаления.

Диспетчер задач Windows

Процессы в диспетчере задач

Существует большое количество способов для удаления файлов. Я расскажу вам обо всех, постепенно приближаясь к наиболее сложным.

Удаление программного клиента

Способ №1: стандартная очистка

1. Кликните правой кнопкой по иконке uTorrent в трее (значки в правом нижнем углу дисплея).

2. Уберите запуск клиента из автозагрузки (если были сделаны соответствующие настройки):

  • откройте «Пуск» (кликните по значку «Windows», расположенному на панели задач);
  • в поле «Найти программы… » наберите команду — msconfig;
  • нажмите «Enter»;
  • в настроечной панели «Конфигурация системы» перейдите в раздел «Автозагрузка»;
  • уберите «галочку» возле элемента uTorrent (клик левой кнопкой);
  • нажмите «Применить» и «OK»;
  • закройте окно без перезапуска Windows.

автозагрузка

3. Активируйте встроенный деинсталлятор:

запуск деинсталлятора

  • cнова зайдите в «Пуск» и откройте «Панель управления»;
  • в разделе «Программы» нажмите «Удаление… »;
  • в списке ПО кликните левой кнопкой по названию клиента;
  • нажмите расположенную вверху каталога функцию «Удалить»;
  • подтвердите активацию деинсталляции: в дополнительном окне включите настройку «Удалить установки», если хотите убрать с компьютера все элементы приложения, и нажмите «OK».

настройка удаления

Примечание. Инсталлятор uTorrent по умолчанию устанавливает в ОС дополнительные утилиты (например, в версии 3.4.4 таковой является «Share It»). Они удаляются из системы аналогичным образом: Пуск → Панель управления → Программы → Удаление программы.

Способ №2: удаление утилитой-деинсталлятором

(на примере Soft Organizer)

Примечание. Данный способ рекомендуется применять, если программа по каким-либо причинам не удаляется стандартным способом или требуется скрупулёзная очистка системы (включая и системный реестр).

1. В окне Soft Organizer, в каталоге ПО, кликните по названию программы-клиента.


2. Активируйте команду «Удалить программу».

3. Когда закончится стандартная деинсталляция (см. способ №1), нажмите функцию «Найти» для поиска неудалившихся файлов.

4. После сканирования нажмите «Удалить» для очистки ОС от найденных следов торрент-клиента.

5. Кликните «Готово». Закройте окно утилиты.

Внимание! Вне зависимости от использованного способа удаления клиента, все скачанные им файлы остаются в целости и сохранности в указанных директориях (системных разделах и папках).






Есть ли простой и быстрый способ удаления файлов?

Любой пользователь ПК периодически удаляет ненужные файлы и папки. Скачивая программы в сети, будьте готовы к тому, что система постепенно засоряется ненужной информацией. Рано или поздно потребуется освободить место на жестком диске.

Часто выбранные файлы не удаляются. Система выдает информацию пользователю о том, что к каталогу нет доступа или он занят другим процессом. В некоторых случаях стоит ограничение на права. Наиболее простым способом решения проблемы является перезагрузка компьютера. Суть действий заключается в удалении процесса использования файла системой.

На этом скрине вы можете видеть пример ошибки

Понять суть перезагрузки можно на примере. Я открываю изображение через фоторедактор и провожу изменения. После сохранения данных закрываю программу и пытаюсь удалить «новоиспеченный» файл. Рабочий процесс зависает и не прекращается. В результате я не могу удалить отредактированное изображение.

Перезагрузка компьютера приводит к закрытию всех процессом и программ. В результате буфер оперативной памяти освобождается. После несложных действий я без проблем смогу удалить ненужную информацию. Не приступайте к другим вариантам, пока не использовали этот. См. также: Как удалить папку, которая не удаляется

Если uTorrent хочется удалить из-за обилия рекламных окон…

То можно обойтись и без деинсталляции, то есть убрать лишь рекламные блоки из интерфейса, а торрент-клиент оставить в системе для дальнейшего использования.

Читайте также: