Исправление двух ошибок, замеченных в работе.
Карантин очищался не полностью
Хранилище карантина зеркалит исходный путь файла внутри своей папки, поэтому многие записи выходят за предел в 260 символов. Плюс перемещённые файлы сохраняют исходные атрибуты — «только чтение», «системный», «скрытый». Обычное рекурсивное удаление на таких спотыкается и молча оставляет часть файлов на диске.
Теперь очистка идёт тем же механизмом, что и принудительное удаление: префикс \\?\ для длинных путей и сброс атрибутов перед удалением. Список каталогов материализуется до начала работы — ленивый перечислитель пропускал записи, пока папки удалялись под ним. Одиночные файлы в корне карантина раньше не удалялись вообще.
Если что-то всё же не поддалось, программа теперь честно пишет, сколько объектов осталось, а не рапортует об успехе.
Файлы висели в списках после удаления
Журнал резервных копий показывал записи, за которыми на диске уже ничего не было, и кнопка «Обновить» не помогала: индекс никогда не чистился. Теперь мёртвые записи отфильтровываются при чтении, а сам файл индекса переписывается после очистки карантина, восстановления файлов и удаления по сроку. Пустой каталог сессии убирается сразу после восстановления.
На карте диска списки крупнейших и давно не открывавшихся файлов теперь проверяют, существует ли путь. Дерево — снимок на момент сканирования, поэтому удалённое другой программой раньше висело в списке до повторного сканирования.
Узел убирается из дерева только если файла действительно нет. Файл, поставленный в очередь на удаление при перезагрузке, до неё занимает место — скрывать его значило бы врать о свободном пространстве.