Структурированное хранилище COM (также известное как структурированное хранилище COM или структурированное хранилище OLE ) — это технология, разработанная корпорацией Microsoft как часть ее операционной системы Windows для хранения иерархических данных в одном файле. Строго говоря, термин структурированное хранилище относится к набору интерфейсов COM , которые должна предоставлять соответствующая реализация, а не к конкретной реализации или конкретному формату файла (фактически, структурированная реализация хранилища вообще не обязана хранить свои данные в файле). Помимо предоставления иерархической структуры для данных, структурированное хранилище может также предоставлять ограниченную форму транзакционной поддержки для доступа к данным. Microsoft предоставляет реализацию, которая поддерживает транзакции, а также ту, которая этого не делает (называемую хранилищем простого режима , последняя реализация также ограничена в других отношениях, хотя и работает лучше).
Структурированное хранилище широко используется в приложениях Microsoft Office , хотя более новые версии (начиная с Office 2007 ) по умолчанию используют Office Open XML на основе XML . Это также важная часть как COM, так и связанных с ним технологий Object Linking and Embedding (OLE). Другие известные приложения структурированного хранилища включают SQL Server , оболочку Windows и многие сторонние программы САПР .
Структурированное хранилище решает некоторые неотъемлемые трудности хранения нескольких объектов данных в одном файле. Одна из трудностей возникает, когда объект, сохраненный в файле, изменяет размер из-за обновления. Если приложение, которое считывает/записывает файл, ожидает, что объекты в файле останутся в определенном порядке, все, что следует за представлением этого объекта в файле, может потребоваться сместить назад, чтобы освободить место, если объект увеличится, или вперед, чтобы заполнить оставшееся пространство, если объект уменьшится. Если файл большой, это может привести к дорогостоящей операции. Конечно, существует множество возможных решений этой трудности, но часто программист приложения не хочет иметь дело с низкоуровневыми деталями, такими как двоичные форматы файлов.
Структурированное хранилище предоставляет абстракцию, известную как поток , представленную интерфейсом IStream
. Поток концептуально очень похож на файл, а IStream
интерфейс предоставляет методы для чтения и записи, аналогичные файловому вводу/выводу. Поток может находиться в памяти , внутри файла, внутри другого потока и т. д., в зависимости от реализации. Еще одной важной абстракцией является хранилище , представленное интерфейсом IStorage
. Хранилище концептуально очень похоже на каталог в файловой системе . Хранилища могут содержать потоки, а также другие хранилища.
Если приложение хочет сохранить несколько объектов данных в файле, одним из способов сделать это будет открытие IStorage
, представляющего содержимое этого файла, и сохранение каждого из объектов в одном IStream
. Один из способов сделать последнее — использовать стандартный интерфейс COM IPersistStream
. OLE в значительной степени зависит от этой модели для внедрения объектов в документы.
Реализация Microsoft использует формат файла, известный как составные файлы , и все широко распространенные реализации структурированных хранилищ считывают и записывают этот формат. Составные файлы используют структуру, подобную FAT , для представления хранилищ и потоков. Фрагменты файла, известные как секторы (они могут соответствовать или не соответствовать секторам базовой файловой системы), выделяются по мере необходимости для добавления новых потоков и увеличения размера существующих потоков. Если потоки удаляются или сжимаются, оставляя нераспределенные сектора, эти секторы можно повторно использовать для новых потоков.
Следующие приложения используют структурированное хранилище OLE (формат составного документа)
Во время фазы бета-тестирования Windows 2000 , она включала функцию под названием Native Structured Storage ( NSS ) для хранения документов Structured Storage (например, двоичных форматов Microsoft Office и thumbs.db
файла, который Windows Explorer использует для кэширования миниатюр) с каждым потоком , который составляет документ, хранящийся в отдельном потоке данных NTFS . Она включала утилиты, которые автоматически разделяют потоки в обычном документе Structured Storage на потоки данных NTFS и наоборот. Однако эта функция была отозвана после Beta 3 из-за несовместимости с другими компонентами ОС, и любые файлы NSS автоматически преобразовывались в формат единого потока данных. [1]