Создание многосессийного диска
API создания образов (IMAPI) поддерживает добавление и удаление файлов в или из следующих типов дисков с несколькими адресами:
- CD-R/CD-RW
- Single-Layer DVD+R/DVD-R
- DVD+R с двумя слоями
- BD-R
- DVD-RW/DVD+RW (только Windows 7)
- DVD-ОЗУ (только Windows 7)
- BD-RE (только Для Windows 7)
Создание мультисессийного диска с помощью IMAPI состоит из следующих шагов. Каждый из этих задокументированных шагов содержит соответствующую часть полного примера скрипта Visual Basic, приведенного в последнем разделе.
Инициализация средства записи дисков
Перед инициализацией устройства объект MsftDiscMaster2 предоставляет перечисление оптических устройств в системе. Интерфейс IDiscMaster2 предоставляет доступ к перечислению устройств, чтобы упростить расположение соответствующего устройства записи. Объект MsftDiscMaster2 также предоставляет уведомления о событиях, когда оптические устройства добавляются на компьютер или удаляются с него.
После обнаружения оптического средства записи и получения назначенного ему идентификатора создайте новый объект MsftDiscMaster2 и инициализируйте средство записи, используя конкретный идентификатор устройства.
Интерфейс IDiscRecorder2 предоставляет доступ к основным сведениям об устройстве, таким как идентификатор поставщика, идентификатор продукта, редакция продукта, а также методам извлечения носителя или закрытия лотка.
Примечание
Дополнительные константы и измерения, объявленные в следующем примере, используются далее в полном примере скрипта, который находится в заключительном разделе этого документа. Эти элементы не требуются для инициализации средства записи дисков.
' *** CD/DVD disc file system types
Const FsiFileSystemISO9660 = 1
Const FsiFileSystemJoliet = 2
Const FsiFileSystemUDF102 = 4
WScript.Quit(Main)
Function Main
Dim Index ' Index to recording drive.
Dim Recorder ' Recorder object
Dim Path ' Directory of files to add
Dim Stream ' Data stream for burning device
Index = 0 ' First drive on the system
Path = "G:\BurnDir" ' Files to add to the disc
' Create a DiscMaster2 object to connect to optical drives.
Dim DiscMaster
Set DiscMaster = WScript.CreateObject("IMAPI2.MsftDiscMaster2")
' Create a DiscRecorder2 object for the specified burning device.
Dim UniqueId
set Recorder = WScript.CreateObject("IMAPI2.MsftDiscRecorder2")
UniqueId = DiscMaster.Item(Index)
Recorder.InitializeDiscRecorder(UniqueId)
Создание модуля записи данных
Объект MsftDiscFormat2Data предоставляет метод записи, его свойства, а также свойства носителя. Интерфейс IDiscFormat2Data предоставляет доступ к этому объекту.
Средство записи дисков привязывается к средству записи формата с помощью свойства IDiscFormat2Data::p ut_Recorder . После привязки средства записи к средству записи формата можно выполнить запросы свойств мультимедиа и свойств записи, прежде чем записывать результирующий образ на диск с помощью метода IDiscFormat2Data::Write .
Примечание
Строка имени клиента, указанная в примере кода ниже, должна быть скорректирована в соответствии с конкретным приложением.
' Create a DiscFormat2Data object and set the recorder
Dim DataWriter
Set DataWriter = CreateObject ("IMAPI2.MsftDiscFormat2Data")
DataWriter.Recorder = Recorder
DataWriter.ClientName = "IMAPIv2 TEST"
Создание объекта файловой системы
Чтобы записать новый сеанс, сначала необходимо создать для него образ записи. Образ записи для форматов ISO9660, Joliet и UDF состоит из файловых систем отдельных файлов и каталогов. Объект MsftFileSystemImage — это объект файловой системы, содержащий файлы и каталоги для размещения на оптическом носителе. Интерфейс IFileSystemImage предоставляет доступ к объекту и параметрам файловой системы.
' Create a new file system image object
Dim FSI
Set FSI = CreateObject("IMAPI2FS.MsftFileSystemImage")
Импорт файловой системы
Прежде чем продолжить, убедитесь, что диск не пуст, проверив свойство IDiscFormat2::get_MediaHeuristicallyBlank .
После создания объекта MsftFileSystemImage необходимо инициализировать свойство IFileSystemImage::p ut_MultisessionInterfaces перед вызовом метода IFileSystemImage::ImportFileSystem или IFileSystemImage::ImportSpecificFileSystem Для импорта файловой системы из последнего записанного сеанса. Эти методы автоматически заполняют объект MsftFileSystemImage сведениями, описывающими ранее записанные файлы и каталоги.
Примечание
Свойство IFileSystemImage::p ut_MultisessionInterfaces обычно инициализируется с помощью интерфейсов мультисессии, предоставляемых модулем записи данных через свойство IDiscFormat2Data::get_MultisessionInterfaces .
Попытки задать свойство IFileSystemImage::p ut_MultisessionInterfaces завершатся ошибкой, если IMAPI не поддерживает многосессию для вставленного в данный момент носителя или не удается добавить носитель по какой-либо другой причине (например, из-за закрытия).
Если предыдущий сеанс записи содержал более одного типа файловой системы, метод IFileSystemImage::ImportFileSystem будет импортировать сведения из самого сложного типа файловой системы. Например, в примере, приведенном в этом разделе, определяемая пользователем функция является импортированной файловой системой. Однако использование метода IFileSystemImage::ImportSpecificFileSystem позволяет импортировать определенный выбор файловой системы.
Примечание
Метод IFileSystemImage::IdentifyFileSystemsOnDisc можно использовать для определения файловых систем, доступных на диске.
' Import the last session, if the disc is not empty, or initialize
' the file system, if the disc is empty
If Not DataWriter.MediaHeuristicallyBlank _
Then
On Error Resume Next
FSI.MultisessionInterfaces = DataWriter.MultisessionInterfaces
If Err.Number <> 0 _
Then
WScript.Echo "Multisession is not supported for this disc"
Main = 1
Exit Function
End If
On Error Goto 0
WScript.Echo "Importing data from the previous session..."
FSI.ImportFileSystem()
Else
FSI.ChooseImageDefaults(Recorder)
End If
Добавление или удаление файлов в файловой системе
После создания объекта файловой системы и импорта файловой системы из предыдущего сеанса вызовите методы IFileSystemImage::CreateFileItem и IFileSystemImage::CreateDirectoryItem , чтобы создать новые объекты файлов и каталогов соответственно. Объекты файлов и каталогов предоставляют конкретные сведения о файлах и каталогах. Кроме того, метод IFsiDirectoryItem::AddTree объекта каталога, представленного через интерфейс IFsiDirectoryItem , можно использовать для добавления существующих файлов и каталогов с другого запоминающего устройства (т. е. жесткого диска).
Метод обновления обработчика событий, доступный для IFileSystemImage , определяет текущий файл, добавляемый в образ файловой системы, количество уже скопированных секторов и общее количество копируемых секторов.
Чтобы удалить существующие файлы и каталоги из файловой системы, используйте методы IFsiDirectoryItem::Remove и IFsiDirectoryItem::RemoveTree объектов каталога, представленных через интерфейс IFsiDirectoryItem . Свойство IFileSystemImage::get_Root используется для получения указателя на корневой каталог файловой системы и интерфейс IFsiDirectoryItem для обхода дерева каталогов.
Примечание
Файлы и каталоги, удаленные с помощью методов IFsiDirectoryItem::Remove и IFsiDirectoryItem::RemoveTree , физически не удаляются с диска, а расширенное программное обеспечение может легко восстановить удаленные сведения.
' Add the directory and its contents to the file system
WScript.Echo "Adding " & Path & " directory to the disc..."
FSI.Root.AddTree Path, false
Создание образа файловой системы
Последним шагом является вызов IFileSystemImage::CreateResultImage , чтобы создать поток данных для образа записи и предоставить к нему доступ через интерфейс IFileSystemImageResult . Этот поток данных можно передать непосредственно в метод IDiscFormat2Data::Write или сохранить в файл для последующего использования.
' Create an image from the file system image object
Dim Result
Set Result = FSI.CreateResultImage()
Stream = Result.ImageStream
Пример сводки
В следующем примере скрипта Visual Basic показано, как использовать объекты IMAPI для создания многосессийных дисков. В примере создается новый сеанс и добавляется каталог на диск. Для простоты код не выполняет обширную проверку ошибок и предполагает следующее:
- В системе установлено совместимое дисковое устройство.
- Устройство диска является первым диском в системе.
- Совместимый диск вставляется в дисковое устройство.
- Файлы для добавления на диск находятся в папке "g:\burndir".
В скрипт можно добавить дополнительные функции, такие как расширенная проверка ошибок, совместимость устройств и мультимедиа, уведомление о событиях и вычисление свободного места на диске.
' This script adds data files from a single directory tree to a
' disc (a new session is added, if the disc already contains data)
' Copyright (C) Microsoft. All rights reserved.
Option Explicit
' *** CD/DVD disc file system types
Const FsiFileSystemISO9660 = 1
Const FsiFileSystemJoliet = 2
Const FsiFileSystemUDF102 = 4
WScript.Quit(Main)
Function Main
Dim Index ' Index to recording drive.
Dim Recorder ' Recorder object
Dim Path ' Directory of files to add
Dim Stream ' Data stream for burning device
Index = 0 ' First drive on the system
Path = "G:\BurnDir" ' Files to add to the disc
' Create a DiscMaster2 object to connect to optical drives.
Dim DiscMaster
Set DiscMaster = WScript.CreateObject("IMAPI2.MsftDiscMaster2")
' Create a DiscRecorder2 object for the specified burning device.
Dim UniqueId
set Recorder = WScript.CreateObject("IMAPI2.MsftDiscRecorder2")
UniqueId = DiscMaster.Item(Index)
Recorder.InitializeDiscRecorder(UniqueId)
' Create a DiscFormat2Data object and set the recorder
Dim DataWriter
Set DataWriter = CreateObject ("IMAPI2.MsftDiscFormat2Data")
DataWriter.Recorder = Recorder
DataWriter.ClientName = "IMAPIv2 TEST"
' Create a new file system image object
Dim FSI
Set FSI = CreateObject("IMAPI2FS.MsftFileSystemImage")
' Import the last session, if the disc is not empty, or initialize
' the file system, if the disc is empty
If Not DataWriter.MediaHeuristicallyBlank _
Then
On Error Resume Next
FSI.MultisessionInterfaces = DataWriter.MultisessionInterfaces
If Err.Number <> 0 _
Then
WScript.Echo "Multisession is not supported for this disc"
Main = 1
Exit Function
End If
On Error Goto 0
WScript.Echo "Importing data from the previous session..."
FSI.ImportFileSystem()
Else
FSI.ChooseImageDefaults(Recorder)
End If
' Add the directory and its contents to the file system
WScript.Echo "Adding " & Path & " directory to the disc..."
FSI.Root.AddTree Path, false
' Create an image from the file system image object
Dim Result
Set Result = FSI.CreateResultImage()
Stream = Result.ImageStream
' Write stream to disc using the specified recorder
WScript.Echo "Writing content to the disc..."
DataWriter.Write(Stream)
WScript.Echo "Finished writing content."
Main = 0
End Function
Связанные темы