WriteFile атомарный?

Я проектирую систему, которая будет записывать данные временных рядов в файл. Данные представляют собой блоки по 8 байтов, разделенные на две части по 4 байта: время и полезная нагрузка.

Согласно MSDN функция WriteFile является атомарной ( http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx), если записанные данные имеют размер меньше сектора.

Поскольку файл будет содержать только эти блоки (отсутствует "структура" файла, поэтому невозможно восстановить поврежденный файл), добавляемые один за другим, крайне важно, чтобы весь блок или ничего не записывалось в файл в все время.

Таким образом, вопрос в том, правильно ли я понял, что файл записи размером менее сектора всегда записывается полностью на диск или не записывается вообще, независимо от того, что происходит во время фактического вызова файла записи?

1 ответ

Решение

WriteFile является атомарным, пока запись не пересекает границу сектора в файле. Таким образом, если размер сектора составляет 512 байтов, запись 20 байтов, начиная со смещения файла 0, будет атомарной, но те же данные, записанные со смещением 500 файла, не будут атомарными. В вашем случае записи должны быть атомарными, поскольку размер сектора должен быть кратным 8.

Этот блог MSDN содержит больше информации о том, как сделать атомарную многосекторную запись без использования транзакционной NTFS.

Другие вопросы по тегам