Создание мультисессионного диска
API создания образов (IMAPI) поддерживает добавление и удаление файлов из следующих типов мультисессионных дисков:
- CD-R/CD-RW
- Single-Layer DVD+R/DVD-R
- Двойной слой DVD+R
- BD-R
- DVD-RW/DVD+RW (Только Windows 7)
- DVD-RAM (Только 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::put_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::put_MultisessionInterfaces следует инициализировать до вызова метода IFileSystemImage::ImportFileSystem или метода IFileSystemImage::ImportSpecificFileSystem для импорта файловой системы из последнего записанного сеанса. Эти методы автоматически заполняют объект MsftFileSystemImage сведениями, описывающими ранее записанные файлы и каталоги.
Заметка
Свойство интерфейсы IFileSystemImage::put_MultisessionInterfaces обычно инициализировано с помощью мультисессионных интерфейсов, предоставляемых модулем записи данных через свойство IDiscFormat2Data::get_MultisessionInterfaces.
Попытка задать свойство IFileSystemImage::put_MultisessionInterfaces завершится ошибкой, если IMAPI не поддерживает мультисессию для текущего вставленного носителя или носитель не может быть дописан по какой-либо другой причине (например, потому что он закрыт).
Если предыдущий сеанс записи содержал несколько типов файловой системы, метод IFileSystemImage::ImportFileSystem импортирует сведения из наиболее расширенного типа файловой системы. Например, в примере, приведенном в этом разделе, UDF — это импортированная файловая система. Однако использование метода 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
Связанные разделы