Может ли IMAPI2 записывать файлы размером> 4 Гб?

Интерфейс IMAPI2 IFileSystem использует интерфейсы COM IStream для представления данных файла. Существует метод AddTree, который добавляет указанное содержимое каталога в IFileSystem. Таким образом, AddTree должен создавать IStream в процессе. Интересно, какую реализацию IStream он использует? Если он использует стандартную реализацию OLE, то у нас возникает неприятная проблема, поскольку потоки OLE не поддерживают файлы размером более 4 ГБ.

Кто-нибудь может пролить свет на этот вопрос?

2 ответа

Решение

IMAPIv2 ограничивает размер файла на диске, совместимом с ISO9660, до 2 ГБ.

Для записи файлов размером более 2 ГБ необходимо установить файловую систему UDF.

 HRESULT hr = FileSystemImage->put_FileSystemsToCreate( FsiFileSystemUDF );

Перечисление FsiFileSystems определяет значения для распознанных файловых систем:

typedef enum FsiFileSystems { 
  FsiFileSystemNone     = 0,
  FsiFileSystemISO9660  = 1,
  FsiFileSystemJoliet   = 2,
  FsiFileSystemUDF      = 4,
  FsiFileSystemUnknown  = 0x40000000
} FsiFileSystems;
  • FsiFileSystemNone Диск не содержит распознанной файловой системы.
  • FsiFileSystemISO9660 Стандартная файловая система CD.
  • FsiFileSystemJoliet Joliet, файловая система.
  • FsiFileSystemUDF Файловая система UDF.
  • FsiFileSystemUnknown. Похоже, диск имеет файловую систему, но макет не соответствует ни одному из распознанных типов.

UDF изначально поддерживает многие функции современных файловых систем:

  • Большой размер раздела (максимум 2 ТБ с размером блока 512 Б или 8 ТБ с размером блока 2 КБ) Размер файла 64-разрядный
  • Расширенные атрибуты (например, именованные потоки или вилки) без ограничения размера
  • Длинные имена файлов (максимум 254 байта, в имени может появляться любой символ)
  • Unicode кодировка имен файлов
  • Разреженный файл
  • Жесткие ссылки
  • Символические ссылки
  • Контрольная сумма метаданных

Ограничения:

  • Ограниченный размер раздела. 32-битный номер блока ограничивает размер раздела до 2 ТБ для размера 512 секторов.
  • Не поддерживает сжатый / зашифрованный файл и каталоги.

Очевидно, AddTree использует SHCreateStreamOnFileEx, который, очевидно, поддерживает большие файлы. Я приму ответ, когда проверю.

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