Всем спасибо. В итоге сейчас сделал свой костыль:
Так как постоянному изменению подлежит лишь малая часть данных (список файлов, флаги, атрибуты файлов), а операция удаления файла очень редкая), сделал так:
Тупо пишем в файл содержимое другого файла, в конце файла блок метаданных ( json с тем чем нужно (плюс список файлов с адресами начала файла и длинны) и в конце добиваем размером этого блока. )
Когда нужно дописать новый файл, делаем seek к началу блока с метаданными и пишем туда, опять добавляя в конец измененный блок с метаданными. Если нужно изменить метаданные, просто меняем их в конце файла, не трогая весь файл.
Удаление — редко используемая функция, и как правило удалять файлы нужно большим количество. Это уж можно сделать, путем перебора всего файла, записывая в новый нужное и пропуская ненужное