Поделиться через


IDirectWriterLock — реализация составных файлов

Реализация составного файла IDirectWriterLock предоставляет способ открытия составного файла в прямом режиме с одним средством записи и несколькими средствами чтения.

Составные файлы можно открывать в прямом режиме с помощью флага STGM_DIRECT. Интерфейс IDirectWriterLock задает STGM_READWRITE|STGM_SHARE_DENY_WRITE флаг как допустимый в прямом режиме, не требуя затраты на копию моментальных снимков.

При открытии составного файла в режиме транзакций с помощью флага STGM_TRANSACTED можно также использовать несколько средств чтения и один модуль записи с помощью STGM_READWRITE|флаг STGM_SHARE_DENY_WRITE. Однако в этом случае для читателей создается копия моментального снимка файла. Часто возникает накладная нагрузка на копию с нуля.

Когда следует использовать

Используйте системную реализацию IDirectWriterLock при открытии хранилища в прямом режиме (STGM_DIRECT) с STGM_READWRITE|флаги STGM_SHARE_DENY_WRITE.

Чтобы получить указатель на IDirectWriterLock, вызовите QueryInterface на IStorage, чтобы получить корневой объект хранилища для составного файла.

Вызовите IDirectWriterLock::WaitForWriteAccess, чтобы получить эксклюзивный доступ на запись к составным файлам. Вызовите IDirectWriterLock::ReleaseWriteAccess, чтобы освободить эксклюзивный доступ на запись.

IDirectWriterLock::HaveWriteAccess указывает, заблокирован ли файл в данный момент.

Замечания

Составная реализация модуля записи с несколькими средствами чтения основана на блокировке диапазона. Модуль записи получает эксклюзивный доступ к хранилищу для записи после того, как все текущие читатели закрыли хранилище. Хотя модуль записи активен, последующие читатели не могут открыть хранилище. Модуль записи вызывает IDirectWriterLock::WaitForWriteAccess для получения эксклюзивного доступа на запись. Затем модуль записи должен вызвать IDirectWriterLock::ReleaseWriteAccess, чтобы освободить хранилище.

Вызов IDirectWriterLock::WaitForWriteAccess требуется перед записью в этом режиме чтения с несколькими модулями чтения. Пытается записать в файл без вызова IDirectWriterLock::WaitForWriteAccess в первую очередь в STG_E_ACCESSDENIED. Эта ошибка возвращается, даже если модуль записи изначально открыл файл, а средства чтения в настоящее время не открывают файл.

Рекомендации по маршалингу

Пользовательский маршалинг обычно используется, когда составной файл маршалируется в другой процесс на том же компьютере. При маршалинге хранилищ права доступа не учитываются, а указатель IStorage передается в новый процесс с теми же режимами доступа и правами, что и исходный процесс маршалинга. Дополнительные сведения о режимах доступа см. в константы STGM. Во время маршалинга блокировка не выполняется или проверяется, чтобы обеспечить монопольный доступ на запись. В этом случае политика однозаписной записи для составных файлов, открытых в режиме единого средства чтения, отсутствует. Вместо этого принудительное применение обрабатывается внутри составной реализации файла.

Так как указательIStorageпередается другому процессу во время маршалинга, то два процесса могут иметь одновременный доступ к одному и тому же составному файлу. Несмотря на то, что вызывающий объект, возможно, получил эксклюзивный доступ на запись к хранилищу путем вызова IDirectWriterLock::WaitForWriteAccess, маршаловая версия также может иметь доступ одновременно. Маршалированные версии не вынуждены закрываться, пока один модуль записи обращается к файлу. В этом случае реализация составного файла синхронизирует операции записи внутри системы.

Если один модуль записи получает монопольный доступ путем вызова, IDirectWriterLock::WaitForWriteAccess, маршалированные хранилища также имеют доступ на запись и не должны вызывать IDirectWriterLock::WaitForWriteAccess. Оба процесса имеют доступ на запись и синхронизацию управляются реализацией внутреннего составного файла.

IDirectWriterLock