Запись и чтение в файл , разные указатели
От: morgot  
Дата: 18.10.24 21:36
Оценка:
Пишу программу, что-то вида базы данных. Если по простому, то она должна читать/писать по определенному смещению (допустим, первая запись, десятая), и — в хидер. Проблема в том, что это не атомарная операция, т.е. может быть так, что я пишу по смещению 0x200 (запись), а потом перехожу к хидеру (скажем, 0x800000 ), и в это время случается сбой. Первый WriteFile успешно завершится, а второй — нет. Как быть?

1. Пробовал маппинг, не вышло, там проблемы с секциями, выравниванием, в общем проще забить.
2. Транзакции — мс не рекомендует их в ОС выше восьмерки, как понимаю уберут в ядро или вообще.
3. Писать во временный файл и потом replacefile — база огромная, да и накладно ради 1 операции копировать туда сюда много данных.

Посоветуйте что-нибудь.
Re: Запись и чтение в файл , разные указатели
От: Слава  
Дата: 18.10.24 23:52
Оценка:
Здравствуйте, morgot, Вы писали:

M>Пишу программу, что-то вида базы данных.

M>Посоветуйте что-нибудь.

Можно почитать, как это делается в базах данных. Через журнал обычно.
Re: Запись и чтение в файл , разные указатели
От: m2user  
Дата: 19.10.24 00:06
Оценка: 9 (1) +4
M>2. Транзакции — мс не рекомендует их в ОС выше восьмерки, как понимаю уберут в ядро или вообще.

Реализуй свои транзакции: rollback журнал как в sqlite.
https://blog.sqlitecloud.io/journal-modes-in-sqlite

The default journal mode in SQLite is the Rollback Journal. In this mode, before any changes are written to the database, a copy of the original unchanged data is stored in a separate rollback journal file. This copy includes all the data pages that the transaction modifies. If the system crashes mid-transaction, SQLite can use this rollback journal to restore the database to its previous state, ensuring that no partial updates are applied.


Кстати, почему бы не взять sqlite (или другую встраиваемую БД), вместо написания своей?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.