Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/alinasmirnova/spaceprofiler
Disk space profiler
https://github.com/alinasmirnova/spaceprofiler
csharp wpf
Last synced: about 1 month ago
JSON representation
Disk space profiler
- Host: GitHub
- URL: https://github.com/alinasmirnova/spaceprofiler
- Owner: alinasmirnova
- Created: 2023-09-04T18:33:45.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2023-09-17T13:36:58.000Z (over 1 year ago)
- Last Synced: 2024-10-29T10:12:44.165Z (3 months ago)
- Topics: csharp, wpf
- Language: C#
- Homepage:
- Size: 674 KB
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# SpaceProfiler
## UI
Дерево отображается сразу же после выбора текущего каталога.
Все рассчёты производятся асинхронно, дерево обновляется в режиме реального времени, а интерфейс остаётся отзывчивым.
Узлы загружаются лениво, при открытии родителя. При закрытии родителя все дочерние узлы удаляются.### Выбор каталога
Для выбора текущего каталога используется пакет [Ookii.Dialogs.Wpf](https://github.com/ookii-dialogs/ookii-dialogs-wpf).
В WPF такой контрол пока [есть только в Preview](https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-7/)### Отображение элементов
Для каждого элемента выводится его фактический размер и процент от размера корневого каталога.В случае, если процент от корневого каталога превышает 20%, элемент выделяется жирным, так как является возможным кандидатом для удаления.
#### Группировка файлов
В случае, если каталог содержит больше одного файла и вложенные каталоги, происходит группировка файлов в отдельный узел Files [N],
где N - количество файлов в каталоге. Это позволяет предоставить пользователю более детальную информацию об интересующем его каталоге.#### Отображение недоступных элементов
Если в ходе обработки дерева встречаются элементы, к которым нет доступа, или симлинки, то они отображаются серым, с особой иконкой
и имеют размер равный 0.#### Иконки
![img_5.png](img_5.png)
![img_4.png](img_4.png)
![img_3.png](img_3.png)
![img_2.png](img_2.png)
![img_1.png](img_1.png)
![img.png](img.png)У каждого элемента дерева есть своя иконка. Они разные для открытой и закрытой папки, пустого и непустого файла, группы файлов и
недоступного элемента.
При изменении состояния элемента иконка так же меняется.#### Сортировка элементов
Сортировка элементов по убыванию размера реализована на уровне отображения элементов дерева при помощи TreeViewItemSortingConverter и происходит в режиме реального времени.### Реакция на изменения в файловой системе
Приложение реагирует на изменения в файловой системе:
- добавление файлов и каталогов
- удаление файлов и каталогов
- изменение файлов
- перемещение каталогов и файлов
- изменение прав доступа к файлам и каталогамОтслеживание изменений запускается одновременно с первичной загрузкой дерева, что позволяет отображать максимально
актуальную информацию.### Отображение прогресса загрузки
В случае, если загрузка дерева с диска занимает больше 1 секунды, в правом верхнем углу окна появляется лоадер и таймер.
После завершения загрузки лоадер изчезает, а время продолжает отображаться.Такое решение позволяет избежать ненужного "моргания" лоадера в случае быстрой загрузки.
Синхронизация изменений файловой системы никак не отображается.
### Переход в Explorer
В контекстном меню элементов списка есть возможность перейти в Explorer.
Для файла/группы файлов откроется каталог, содержащий файл. При клике на каталог - откроется он сам.Функция недоступна, если к папке нет доступа или она не существует на диске.
### Удаление корня
Если во время работы приложения удалить корневой каталог, то в отображении останется узел размера 0.Если отменить удаление каталога, то изменения подтянутся и в интерфейс.
### Обработка папок с большим количеством элементов
Если в каталоге очень много элементов, то это будет приводить к зависанию интерфейса и негативному пользовательскому опыту.
Но в целевом сценарии пользователя и не интересуют все элементы - он хочет найти самые крупные и получить общее представление о содержимом папки.Для директорий с большим количеством папок (>100) рядом с названием выводится количество подкаталогов. При попытке развернуть такой узел в интерфейсе
отобразиться только 20 самых крупных подкаталогов.
Для директорий с большим количеством файлов (>100) будет добавлен узел "Files [N]". При попытке развернуть такой узел в интерфейсе
отобразиться только 20 самых крупных файлов.
### Отображение длинных названий
Если название элемента превышает 50 символов, то оно будет обрезано и в конце добавится "...". Для таких элементов при наведении на них появляется tooltip с полным именем# Внутреннее устройство приложения
## SpaceProfiler
Для обновления дерева в NodesUpdater создаётся фоновый поток. Раз в 500мс он получает изменения из модели и анализирует, что в отображении нужно обновить.
На UI треде выполняется только непосредственное изменение узлов.Все ошибки при обработке изменений игнорируются. В худшем случае пользователь получит не очень актуальное отображение, но даже оно уже может дать ему ответ на интересующий вопрос. А ещё оно может "починиться" при следующем обновлении.
## SpaceProfilerLogic
### FileSystemEntryTree
Модель дерева в памяти. Поддерживает многопоточное изменение. Умеет по пути на диске актуализировать его состояние в дереве. Возвращает список изменённых узлов.
### SelfSustainableTree
Объединяет в себе логику получения информации для обновления дерева. Работа выстроена через взаимодействие разных потоков по принципу producer-consumer.LoadFromDisk и WatchChanges получают список путей, которые нужно актуализировать в дереве, и передают их через очереди в ApplyChanges и ApplyRenewChanges, где и происходит само добавление в дерево.
Реализован механизм ретрая (1 раз) для обработки изменений в ходе первичной загрузки дерева.
Список изменённых узлов по запросу выдаётся UI.
Степень параллелизации можно менять только на уровне количества ApplyChanges и ApplyRenewChanges. Текущее количество я определила на основе времени обработки своего диска C (см. [пункт 10 в разделе Что можно улучшить](#improvement10)).
### DirectoryWatcher
Отслеживание изменений в директории при помощи [FileSystemWatcher](https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher?view=net-7.0).### Тесты
В проекте SpaceProfilerLogicTests есть тесты на построение и актуализацию дерева, мониторинг изменений в файловой системе
# Что можно улучшить
- Сделать отображение дерева ещё красивее: выровнять столбцы между уровнями дерева, добавить названия колонок
- Отображать не только фактический размер файла, но и размер файла на диске с использованием fileapi.h
- Добавить логирование
- Обрабатывать Rename не как Create + Delete, а отдельно, не перестраивая поддерево заново
- Можно подумать в сторону исключения определённых системных папок из анализа полностью или частично. Например, в Windows есть каталог WinSxS, который часто меняется, содержит много подкаталогов, но при этом вряд ли станет кандидатом на удаления для очистки диска
- Развивая пункт 5, можно сделать более сложную и "умную" систему предложения пользователя вариантов для удаления и сделать отображение более гибким
- Добавить удаление в контекстное меню элемента
- Отображать прогресс загрузки, возможно для каждого элемента
- Сделать бенчмарки на загрузку дерева с диска
- Распараллелить загрузку дерева с диска и научиться динамически понимать, сколько потоков лучше брать