Skip to content

oscript-library/change-indexer

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

change-indexer

Кроссплатформенная библиотека для отслеживания изменений файлов в каталогах.

Строит плоский отсортированный индекс файловой системы и сравнивает два индекса за линейное время 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)

CIDX v1
47370
Catalogs/Контрагенты/Ext/ObjectModule.bsl	1234	20260227122530
Catalogs/Контрагенты/Forms/ФормаЭлемента/Ext/Form.xml	5678	20260227122531
...
  • Строка 1: заголовок CIDX v1
  • Строка 2: количество записей
  • Далее: по одной записи на строку, разделитель полей — табуляция

Разработка

Сборка .NET-компоненты

dotnet build src/change_indexer.csproj -c Release -o Components/dotnet --no-incremental

Запуск тестов

oneunit execute -d tests -r --mode flat

Демо

oscript 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

About

Кроссплатформенная библиотека OneScript для отслеживания изменений файлов в каталогах через .NET-индексирование

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • 1C Enterprise 87.1%
  • C# 12.9%