Работа с *.txt с нескольких приложений одновременно?

Задача: Обеспечить параллельную (например, многотерминальную) работу с базой данных нескольких пользователей одновременно.

База данных текстовая, 1 файл, 10+к строк формата знач1;знач2;...;знач12.

Запускается программа, в listBox выгружаются значения. Далее из программы с ними можно работать (удалить, изменить, добавить). Проблема в том что каждый раз меняя значения, нужно перезаписывать весь файл, поменял строку 5000 к примеру, надо перезаписывать весь файл, так же с удалением. Пока перезаписывается, вторая программа ожидает. Как можно более грамотно решить задачу?
  • Вопрос задан
  • 520 просмотров
Решения вопроса 1
@Sumor
Для одновременной работы с файлом несколькими приложениями его нужно открывать во всех приложениях со специальным указанием: FileShare.ReadWrite
FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

В этом случае все приложения смогут одновременно читать и писать в файл. Это накладывает определённые ограничения на приложения - они должны как-то договариваться и понимать куда они могут писать, а куда - нет.
Каждая программа должна писать только изменения в файл, а не переписывать его - иначе другие программы отвалятся.
Это большой геморрой. Так делать не надо.
Если вы всё-таки решитесь, то нужно файл разбить на блоки. Перед записью в блок программа будет его помечать, что-бы другие программы ждали, пока вы закончите с ним работать, после записи - сбрасывать пометку. Если данные удалились - нужна пометка, что блок удалён, так как нельзя сдвигать файл - его могут читать другие программы. Если данные увеличились в размере - ставить отметку удаления и записывать новые данные в конец. И тд, и тп.
Большая часть из этого заложено, например, в формат dbf. Но реализовывать всё это придётся руками.
Кроме того остаётся вопрос с синхронизацией изменений. Если вы в одной программе поменяли список - как об этом узнает программа на другом компьютере. Это может быть слежение за временем изменения файла, или за специальными отметками в файле ... Постоянные проблемы с синхронизацией, постоянное состояние гонки, взаимоблокировки и т.д. В общем, так делать не надо.
Конечно, если каждой запущенной программе отводится только одна строчка и другие её не трогают, то можно попробовать изменять только её.

Если у вас, в основном, чтения и иногда "точечные" изменения, то можно предложить следующий вариант:
при записи: ожидать завершение всех чтений, а затем блокировать файл с FileShare.None, изменить и отпустить.
при чтении: ожидать завершение записи, если она есть, затем открытие файла с FileShare.Read (это не блокирует другие чтения), быстрое чтение и закрытие файла.
Под ожиданием я понимаю попытку открытия файла с соответствующими параметрами, и в случае исключения повтор через таймаут.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
Написать велосипед сервис/сервер, который будет с одной стороны взаимодействовать с программами, с другой писать файл на диск, а внутри - кэшировать это.

Получится сервер баз данных. Потихоньку он обрастет логикой хранения со страничной организацией, строки начнет хранить в файле в некоем упорядоченном формате поблочно и при необходимости будет писать-читать например только один блок...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы