Обратите внимание, что это не является дубликатом блокировки файла и удаления файла . (Разница - платформа. Операции с файлами, такие как блокировка и удаление, имеют совершенно разную семантику, поэтому использование будет другим).
У меня следующая проблема. Я хочу создать хранилище сеансов на основе файловой системы, в котором данные каждого сеанса хранятся в простом файле с именами идентификаторов сеансов.
Я хочу следующий API: write(sid,data,timeout)
, read(sid,data,timeout)
, remove(sid)
где sid == имя файла, также я хочу иметь какой-то GC, который может удалить все сеансы по тайм-ауту.
Довольно простая задача, если вы работаете с одним процессом, но абсолютно не тривиальная при работе с несколькими процессами или даже над общими папками.
Самое простое решение, о котором я думал, было:
write/read:
hanlde=CreateFile
LockFile(handle)
read/write data
UnlockFile(handle)
CloseHanlde(handle)
GC (for each file in directory)
hanlde=CreateFile
LockFile(handle)
check if timeout occured
DeleteFile
UnlockFile(handle)
CloseHanlde(handle)
Но AFIAK Я не могу вызвать DeleteFile
для открытого заблокированного файла (в отличие от Unix, где блокировка файла
не является обязательным, и для открытых файлов разрешено удаление ссылок.
Но если я поставлю DeleteFile
вне цикла блокировки, может произойти плохой сценарий
GC - CreateFile/LockFile/Unlock/CloseHandle,
write - oCreateFile/LockFile/WriteUpdatedData/Unlock/CloseHandle
GC - DeleteFile
У кого-нибудь есть идеи, как решить эту проблему? Есть ли какие-нибудь хитрости, которые позволяют
совмещать блокировку файлов и удаление файлов или выполнять операции с атомарными файлами (Win32)?
Примечания:
- Я не хочу использовать базу данных,
- Я ищу решение для Win32 API для NT 5.01 и выше
Спасибо.