Исходные коды программ и игр

Программирование - работа и хобби

Исходники применения составных файлов

Язык программирования C++

Что такое составной файл?

Немного теории. Составной файл (структурированное хранилище) - файл содержащий в себе некое подобие файловой системы. Сам головной файл является обычным файлом, имеет все свойства файла (т.е. копируется, удаляется, переименовывается и т.п.). Внутри есть каталоги называемые хранилищами, есть файлы называемые потоками. К сведению файлы .doc (MSWord), .xls (MSExcel) и др. являются составными файлами.

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

Интерфейс IStorage

Интерфейс IStorage поддерживает создание и управление объектами структурированного хранилища. Структурированное хранилище позволяет иерархически хранить информацию в одном файле и часто называется «файловой системой в файле». Элементами структурированного хранилища являются хранилища и потоки. Хранилища подобны каталогам, а потоки аналогичны файлам. Внутри структурированного хранилища есть первичный объект, который может содержать субхранилища (подкаталоги), возможно, вложенные, и потоки. Хранилища предоставляют структуру объекта, а потоки содержат данные, которыми манипулируют через интерфейс IStream.

Методы IStorage

Интерфейс IStorage содержит методы для создания и управления корневым объектом хранения, дочерними объектами хранения и потоковыми объектами. Эти методы могут создавать, открывать, перечислять, перемещать, копировать, переименовывать или удалять элементы в объекте хранения. Интерфейс IStorage предоставляет методы для фиксации изменений и возврата к последней зафиксированной версии. Потоки могут открыться в режиме только для чтения или в режиме чтения / записи.


// создаёт и одновременно открывает новый объект хранения
HRESULT CreateStorage
(
  const OLECHAR *pwcsName, 
  DWORD         grfMode,
  DWORD         reserved1,
  DWORD         reserved2,

  // получаем указатель на созданное хранилище
  IStorage      **ppstg
);

// открывает существующий объект с определенным режимом доступа
IStorage::OpenStorage

// создает и открывает новый поток в данном хранилище
IStorage::CreateStream

// открывает поток в данном хранилище с определенным режимом доступа
IStorage::OpenStream

Интерфейс IStream

Интерфейс IStream позволяет читать и записывать данные в потоковые объекты. Потоки аналогичны файлам. Каждый объект потока имеет свои собственные права доступа и указатель поиска. Потоки могут оставаться открытыми в течение длительных периодов времени без использования ресурсов файловой системы.

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

Практические примеры

Программа тестирования составных файловИсходник содержит практические реализации интерфейсов IStorage и IStream. На примере показаны создание объектов хранения, потоков хранилища, запись файлов в потоки, переименование и удаление потоков и субхранилищ.

В архиве два исходника, с примерами использования составных файлов в качестве хранителей ресурсов программы. Чтение потоков из составного файла: загрузка изображения, загрузка текстовой информации, загрузка звука. Примеры использования составных файлов для GDI и GDI+.

Исходники протестированы в средах программирования Visual C++6, Visual C++7, Visual Studio .NET 2003. Для создания и редактирования составных файлов предлагается программа CompoundFK2.0 (находится в разделе прикладные программы).

Файл загрузки Размер Кол-во загрузок
examplecf_vs6.zip 💾 1345Кбайт 7436