WriteFile атомарный? - PullRequest
       9

WriteFile атомарный?

6 голосов
/ 04 мая 2010

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

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

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

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

1 Ответ

7 голосов
/ 13 января 2011

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

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

...