Поделиться через


Создание многосессийного диска

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

Использование IMAPI

IStream

IDiscMaster2

IDiscFormat2Data

IFileSystemImage