Skip to content

Architecture

DiskScope edited this page Oct 20, 2026 · 1 revision

Архитектура

Цели

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

Модули

Модуль Ответственность
DiskScope точка входа, окно, меню, Settings scene
DiskScopeKit сканер, дерево, UI, модели, медиа, обновления
DiskScopeCLI замеры и отладочные прогоны
DiskScopeSnapshots рендер PNG без screen recording
DiskScopeKitTests 42 XCTest

Поток данных

папка
  → DiskScanner (getattrlistbulk + openat)
  → ScanTree (плоские массивы узлов)
  → AppModel
  → карта / крупнейшие / типы / медиа

Сканер

  • основной путь: getattrlistbulk + openat;
  • запасной: readdir + fstatat;
  • прогресс и отмена через ScanCancellation;
  • пакеты .app, .photoslibrary и подобные считаются одним объектом;
  • жёсткие ссылки считаются по каждому пути;
  • ошибки доступа собираются в отчёт, а не прерывают скан.

Дерево

ScanTree хранит плоские массивы узлов и общий UTF-8-блоб имён. Это уменьшает количество аллокаций и позволяет быстро обходить дерево. Файлы меньше 64 КБ агрегируются по папкам, чтобы не раздувать память.

Удаление использует copy-on-write: после перемещения в Корзину создаётся обновлённое дерево без полного перескана.

Карта

Squarified treemap укладывает прямоугольники по площади. Для крупных узлов показывается второй уровень. UI рисует карту в SwiftUI/AppKit и поддерживает навигацию, наведение и подсказки.

Медиа

MediaSearchEngine обходит выбранные папки, фильтрует расширения и возвращает результаты. MediaMover переносит файлы с уникальными именами и fallback copy+remove между томами. PhotosImporter использует PhotoKit и shouldMoveFile.

Обновления

UpdateChecker делает GET к GitHub Releases API, сравнивает semver и возвращает состояние: idle, checking, upToDate, available, failed. Сеть используется только по кнопке.

UI

  • кастомный title bar;
  • sidebar;
  • HeaderView с хлебными крошками и вкладками;
  • карта, таблицы, медиа, настройки;
  • палитра команд ⌘K;
  • светлая и тёмная темы.

Безопасность

  • файлы читаются только для метаданных;
  • запись — только по действию пользователя;
  • нет сетевых запросов, кроме проверки обновлений;
  • нет сторонних зависимостей.

Ограничения

  • снимки APFS и purgeable не учитываются отдельно;
  • поиск дубликатов не реализован;
  • жёсткие ссылки дублируются;
  • медиа-поиск ограничен 25 000 результатов.

См. Сборка из исходников и Возможности.

Clone this wiki locally