Compartir a través de


Crear un disco multisesión

Image Mastering API (IMAPI) admite la adición y eliminación de archivos a, o desde, los siguientes tipos de disco multisesión:

  • CD-R/CD-RW
  • Single-Layer DVD+R/DVD-R
  • Capa dual de DVD+R
  • BD-R
  • DVD-RW/DVD+RW (solo Windows 7)
  • DVD-RAM (solo Windows 7)
  • BD-RE (solo Windows 7)

La creación de un disco multisesión mediante IMAPI consta de los pasos siguientes. Cada uno de estos pasos documentados contiene la parte pertinente del ejemplo completo de script de Visual Basic proporcionado en la sección final.

Inicialización de la grabadora de discos

Antes de la inicialización del dispositivo, el objeto MsftDiscMaster2 proporciona una enumeración de los dispositivos ópticos en el sistema. La interfaz IDiscMaster2 proporciona acceso a esta enumeración de dispositivos para facilitar la ubicación del dispositivo de grabación adecuado. El objeto MsftDiscMaster2 también proporciona notificaciones de eventos cuando se agregan o quitan dispositivos ópticos de una máquina.

Después de localizar una grabadora óptica y recuperar el identificador asignado, cree un nuevo objeto MsftDiscMaster2 e inicialice la grabadora con el identificador de dispositivo específico.

La interfaz IDiscRecorder2 proporciona acceso a información básica del dispositivo, como el identificador de proveedor, el identificador de producto, la revisión del producto, así como los métodos para expulsar medios o cerrar la bandeja.

Nota

Las constantes y dimensiones adicionales declaradas en el ejemplo siguiente se usan más adelante en el script de ejemplo completo ubicado en la sección final de este documento. Estos elementos no son necesarios para el acto de inicializar una grabadora de disco.

 

' *** 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)

Creación de un objeto de escritura de datos

El objeto MsftDiscFormat2Data proporciona el método de escritura, sus propiedades, así como las propiedades específicas del medio. La interfaz IDiscFormat2Data proporciona acceso a este objeto.

La grabadora de discos se enlaza al sistema de escritura de formato mediante la propiedad IDiscFormat2Data::p ut_Recorder . Una vez enlazada la grabadora al sistema de escritura de formato, las consultas de propiedades específicas de medios y escritura se pueden realizar antes de escribir la imagen de resultado en el disco mediante el método IDiscFormat2Data::Write .

Nota

La cadena de nombre de cliente especificada en el código de ejemplo siguiente debe ajustarse según corresponda para la aplicación específica.

 

    ' Create a DiscFormat2Data object and set the recorder
    Dim DataWriter
    Set DataWriter = CreateObject ("IMAPI2.MsftDiscFormat2Data")
    DataWriter.Recorder = Recorder
    DataWriter.ClientName = "IMAPIv2 TEST"

Creación del objeto del sistema de archivos

Para registrar una nueva sesión, primero se debe generar una imagen de grabación. Una imagen de grabación para formatos ISO9660, Joliet y UDF constan de sistemas de archivos de archivos individuales y directorios. El objeto MsftFileSystemImage es el objeto del sistema de archivos que contiene los archivos y directorios que se van a colocar en el medio óptico. La interfaz IFileSystemImage proporciona acceso al objeto y la configuración del sistema de archivos.

    ' Create a new file system image object
    Dim FSI
    Set FSI = CreateObject("IMAPI2FS.MsftFileSystemImage")

Importación de un sistema de archivos

Antes de continuar, asegúrese de que el disco no está en blanco comprobando la propiedad IDiscFormat2::get_MediaHeuristicallyBlank .

Después de crear el objeto MsftFileSystemImage , la propiedad IFileSystemImage::p ut_MultisessionInterfaces debe inicializarse antes de una llamada a IFileSystemImage::ImportFileSystem o al método IFileSystemImage::ImportSpecificFileSystem para importar el sistema de archivos desde la última sesión grabada. Estos métodos rellenarán automáticamente el objeto MsftFileSystemImage con información que describe los archivos y directorios grabados previamente.

Nota

La propiedad IFileSystemImage::p ut_MultisessionInterfaces se inicializa normalmente con las interfaces de multisesión proporcionadas por el escritor de datos a través de la propiedad IDiscFormat2Data::get_MultisessionInterfaces .

 

Se producirá un error al intentar establecer la propiedad IFileSystemImage::p ut_MultisessionInterfaces si IMAPI no admite multisesión para el medio insertado actualmente o el medio no se puede anexar por algún otro motivo (por ejemplo, porque está cerrado).

Si la sesión de grabación anterior contenía más de un tipo de sistema de archivos, el método IFileSystemImage::ImportFileSystem importará información del tipo de sistema de archivos más avanzado presente. Por ejemplo, en el ejemplo proporcionado en este tema, UDF es el sistema de archivos importado. Sin embargo, el uso del método IFileSystemImage::ImportSpecificFileSystem permite importar la selección específica del sistema de archivos.

Nota

El método IFileSystemImage::IdentifyFileSystemsOnDisc se puede usar para determinar qué sistemas de archivos están disponibles en el disco.

 

    ' 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

Agregar o quitar archivos en el sistema de archivos

Después de crear el objeto del sistema de archivos e importar el sistema de archivos de la sesión anterior, llame a los métodos IFileSystemImage::CreateFileItem e IFileSystemImage::CreateDirectoryItem para crear nuevos objetos de archivo y directorio, respectivamente. Los objetos de archivo y directorio proporcionan detalles específicos sobre los archivos y directorios. Como alternativa, el método IFsiDirectoryItem::AddTree de un objeto de directorio, representado a través de la interfaz IFsiDirectoryItem , se puede usar para agregar archivos y directorios existentes desde otro dispositivo de almacenamiento (es decir, un disco duro).

El método de actualización del controlador de eventos disponible para IFileSystemImage identifica el archivo actual que se va a agregar a la imagen del sistema de archivos, el número de sectores ya copiados y el número total de sectores que se van a copiar.

Para quitar los archivos y directorios existentes del sistema de archivos, use los métodos IFsiDirectoryItem::Remove e IFsiDirectoryItem::RemoveTree de los objetos de directorio representados a través de la interfaz IFsiDirectoryItem . La propiedad IFileSystemImage::get_Root se usa para obtener un puntero al directorio raíz del sistema de archivos y la interfaz IFsiDirectoryItem para recorrer el árbol de directorios.

Nota

Los archivos y directorios eliminados a través de los métodos IFsiDirectoryItem::Remove e IFsiDirectoryItem::RemoveTree no se quitan físicamente del disco y el software avanzado puede recuperar fácilmente la información eliminada.

 

    ' Add the directory and its contents to the file system 
    WScript.Echo "Adding " & Path & " directory to the disc..."
    FSI.Root.AddTree Path, false

Construcción de una imagen de sistema de archivos

El último paso consiste en llamar a IFileSystemImage::CreateResultImage para crear un flujo de datos para la imagen de grabación y proporcionar acceso a ella a través de la interfaz IFileSystemImageResult . Este flujo de datos se puede proporcionar directamente al método IDiscFormat2Data::Write o guardarse en un archivo para su uso posterior.

    ' Create an image from the file system image object
    Dim Result
    Set Result = FSI.CreateResultImage()
    Stream = Result.ImageStream

Resumen de ejemplo

En el siguiente ejemplo de script de Visual Basic se muestra cómo usar objetos IMAPI para crear discos de varias sesiones. En el ejemplo se crea una nueva sesión y se agrega un directorio al disco. Por motivos de simplicidad, el código no realiza una comprobación exhaustiva de errores y asume lo siguiente:

  • Se instala un dispositivo de disco compatible en el sistema.
  • El dispositivo de disco es la primera unidad del sistema.
  • Se inserta un disco compatible en el dispositivo de disco.
  • Los archivos que se van a agregar al disco se encuentran en "g:\burndir".

Se pueden agregar funcionalidades adicionales, como la comprobación de errores, la compatibilidad de dispositivos y medios, la notificación de eventos y el cálculo del espacio libre en el disco.

' 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

Uso de IMAPI

Istream

IDiscMaster2

IDiscFormat2Data

IFileSystemImage