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


Создание мультисессионного диска

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

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

IStream

IDiscMaster2

IDiscFormat2Data

IFileSystemImage