Кроссплатформенная библиотека для отслеживания изменений файлов в каталогах.
Строит плоский отсортированный индекс файловой системы и сравнивает два индекса за линейное время O(n). Сканирование, сортировка, сравнение и сохранение выполняются целиком на стороне .NET (System.IO) за один проход — без промежуточных файлов и без зависимости от PowerShell, bash и других платформенных утилит.
opm install change-indexer
Требуется OneScript 2.0+.
Менеджер = Новый МенеджерИндексов("C:/project/src", "C:/project/.index/src.cidx");
Менеджер.ДобавитьИсключение(".git");
// Получить изменения и сразу сохранить новый индекс — один вызов
Изменения = Менеджер.ОбновитьИндекс();
Если Изменения.ЕстьИзменения() Тогда
Для Каждого Путь Из Изменения.Измененные() Цикл
Сообщить("Изменён: " + Путь);
КонецЦикла;
КонецЕсли;
Сообщить("Файлов в индексе: " + Менеджер.КоличествоФайлов());Высокоуровневый фасад — обычно достаточно только его.
Менеджер = Новый МенеджерИндексов(КаталогНаблюдения, ПутьКФайлуИндекса);| Метод | Возврат | Описание |
|---|---|---|
ОбновитьИндекс() |
РезультатСравнения |
Получить изменения и сразу сохранить новый индекс. Сканирование, сортировка, сравнение и запись — за один проход в .NET |
ПолучитьИзменения() |
РезультатСравнения |
Сравнить сохранённый индекс с текущим состоянием каталога без сохранения. Если индекса нет — все файлы считаются добавленными |
Перестроить() |
— | Просканировать каталог и сохранить индекс на диск (эквивалентно ОбновитьИндекс(), но без возвращаемого значения) |
ПолучитьТекущийИндекс() |
ИндексКаталога |
Получить снимок каталога без сохранения на диск |
КоличествоФайлов() |
Число |
Количество файлов после последнего вызова ОбновитьИндекс() |
СуществуетИндекс() |
Булево |
Проверить наличие сохранённого файла индекса |
УдалитьИндекс() |
— | Удалить файл индекса |
ДобавитьИсключение(Маска) |
— | Исключить файлы, содержащие подстроку Маска в пути |
ПолучитьКаталогНаблюдения() |
Строка |
Путь к каталогу наблюдения |
ПолучитьПутьКИндексу() |
Строка |
Путь к файлу индекса |
Результат сравнения двух индексов.
| Метод | Возврат | Описание |
|---|---|---|
Добавленные() |
Массив<Строка> |
Пути файлов, появившихся в новом индексе |
Удаленные() |
Массив<Строка> |
Пути файлов, отсутствующих в новом индексе |
Измененные() |
Массив<Строка> |
Пути файлов с изменённым размером или датой |
ЕстьИзменения() |
Булево |
Есть ли хотя бы одно изменение |
КоличествоИзменений() |
Число |
Сумма добавленных, удалённых и изменённых |
Низкоуровневый класс — плоский отсортированный список записей файловой системы.
Каждая запись — строка формата:
относительный/путь/файла<TAB>размер<TAB>yyyyMMddHHmmss
Пути всегда используют прямой слеш (/), независимо от ОС.
| Метод | Возврат | Описание |
|---|---|---|
ПостроитьПоКаталогу(Каталог) |
— | Рекурсивно просканировать каталог и построить индекс |
Сохранить(ПутьКФайлу) |
— | Сохранить индекс в файл формата CIDX v1 |
Загрузить(ПутьКФайлу) |
— | Загрузить индекс из файла CIDX v1 |
ПолучитьИзменения(СтарыйИндекс) |
РезультатСравнения |
Сравнить с другим индексом |
РазобратьЗапись(Запись) |
Структура |
Разобрать строку записи в структуру с полями Путь, Размер, ДатаИзменения |
Количество() |
Число |
Количество записей в индексе |
ПолучитьЗаписи() |
Массив<Строка> |
Массив строк-записей |
ПолучитьКорневойКаталог() |
Строка |
Корневой каталог, по которому строился индекс |
ДобавитьИсключение(Маска) |
— | Добавить подстроку-исключение |
ОчиститьИсключения() |
— | Очистить все исключения |
Исключения задаются как подстроки пути. Файл пропускается, если его относительный путь содержит любую из масок (без учёта регистра).
Менеджер = Новый МенеджерИндексов(Каталог, ФайлИндекса);
Менеджер.ДобавитьИсключение(".git");
Менеджер.ДобавитьИсключение(".bak");
Изменения = Менеджер.ПолучитьИзменения();CIDX v1
47370
Catalogs/Контрагенты/Ext/ObjectModule.bsl 1234 20260227122530
Catalogs/Контрагенты/Forms/ФормаЭлемента/Ext/Form.xml 5678 20260227122531
...
- Строка 1: заголовок
CIDX v1 - Строка 2: количество записей
- Далее: по одной записи на строку, разделитель полей — табуляция
dotnet build src/change_indexer.csproj -c Release -o Components/dotnet --no-incrementaloneunit execute -d tests -r --mode flatoscript example/demo.os <каталог>Тяжёлые операции выполняются целиком в .NET:
- Сканирование —
System.IO.DirectoryInfo.EnumerateFiles, рекурсивный обход - Сортировка —
List<string>.Sort(StringComparer.Ordinal)на стороне C# - Сравнение — merge join двух отсортированных списков (O(n))
- Сохранение — запись CIDX v1 через
StreamWriter
OneScript-классы (МенеджерИндексов, ИндексКаталога, РезультатСравнения) — тонкие обёртки, делегирующие .NET-компоненте СканерКаталога.
vanessa-opensource