Criando um disco multissessão
A IMAPI (API de Masterização de Imagem ) dá suporte à adição e remoção de arquivos de ou para os seguintes tipos de disco multissessão:
- CD-R/CD-RW
- Single-Layer DVD+R/DVD-R
- DVD+R Dual Layer
- BD-R
- DVD-RW/DVD+RW (somente Windows 7)
- DVD-RAM (somente Windows 7)
- BD-RE (somente Windows 7)
A criação de um disco multissessão usando IMAPI consiste nas etapas a seguir. Cada uma dessas etapas documentadas contém a parte relevante do exemplo de script completo do Visual Basic fornecido na seção final.
Inicializando o Gravador de Disco
Antes da inicialização do dispositivo, o objeto MsftDiscMaster2 fornece uma enumeração dos dispositivos ópticos no sistema. A interface IDiscMaster2 fornece acesso a essa enumeração de dispositivo para facilitar o local do dispositivo de gravação apropriado. O objeto MsftDiscMaster2 também fornece notificações de eventos quando dispositivos ópticos são adicionados ou removidos de um computador.
Depois de localizar um gravador óptico e recuperar a ID atribuída a ele, crie um novo objeto MsftDiscMaster2 e inicialize o gravador usando a ID do dispositivo específica.
A interface IDiscRecorder2 fornece acesso a informações básicas do dispositivo, como ID do fornecedor, ID do produto, revisão do produto, bem como os métodos para ejetar mídia ou fechar a bandeja.
Observação
As constantes e dimensões adicionais declaradas no exemplo a seguir são usadas posteriormente no script de exemplo completo localizado na seção final deste documento. Esses elementos não são necessários para o ato de inicializar um gravador 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)
Criando um gravador de dados
O objeto MsftDiscFormat2Data fornece o método de escrita, suas propriedades, bem como as propriedades específicas da mídia. A interface IDiscFormat2Data fornece acesso a esse objeto.
O gravador de disco é associado ao gravador de formato usando a propriedade IDiscFormat2Data::p ut_Recorder . Depois que o gravador é associado ao gravador de formato, as consultas de propriedade específicas de mídia e gravação podem ser executadas antes de gravar a imagem de resultado em disco usando o método IDiscFormat2Data::Write .
Observação
A cadeia de caracteres de nome do cliente especificada no código de exemplo abaixo deve ser ajustada conforme apropriado para o aplicativo específico.
' Create a DiscFormat2Data object and set the recorder
Dim DataWriter
Set DataWriter = CreateObject ("IMAPI2.MsftDiscFormat2Data")
DataWriter.Recorder = Recorder
DataWriter.ClientName = "IMAPIv2 TEST"
Criando o objeto do sistema de arquivos
Para registrar uma nova sessão, uma imagem de gravação deve ser gerada para ela primeiro. Uma imagem de gravação para formatos ISO9660, Joliet e UDF consiste em sistemas de arquivos de arquivos e diretórios individuais. O objeto MsftFileSystemImage é o objeto do sistema de arquivos que contém os arquivos e diretórios a serem colocados na mídia óptica. A interface IFileSystemImage fornece acesso ao objeto e às configurações do sistema de arquivos.
' Create a new file system image object
Dim FSI
Set FSI = CreateObject("IMAPI2FS.MsftFileSystemImage")
Importando um sistema de arquivos
Antes de continuar, verifique se o disco não está em branco verificando a propriedade IDiscFormat2::get_MediaHeuristicallyBlank .
Depois de criar o objeto MsftFileSystemImage , a propriedade IFileSystemImage::p ut_MultisessionInterfaces deve ser inicializada antes de uma chamada para o método IFileSystemImage::ImportFileSystem ou IFileSystemImage::ImportSpecificFileSystem para importar o sistema de arquivos da última sessão gravada. Esses métodos preencherão automaticamente o objeto MsftFileSystemImage com informações que descrevem os arquivos e diretórios gravados anteriormente.
Observação
A propriedade IFileSystemImage::p ut_MultisessionInterfaces normalmente é inicializada com as interfaces multisessão fornecidas pelo gravador de dados por meio da propriedade IDiscFormat2Data::get_MultisessionInterfaces .
As tentativas de definir a propriedade IFileSystemImage::p ut_MultisessionInterfaces falharão se o IMAPI não der suporte à multissessão para a mídia inserida no momento ou se a mídia não puder ser acrescentada por algum outro motivo (por exemplo, porque ela está fechada).
Se a sessão de gravação anterior contiver mais de um tipo de sistema de arquivos, o método IFileSystemImage::ImportFileSystem importará informações do tipo de sistema de arquivos mais avançado presente. Por exemplo, no exemplo fornecido neste tópico, UDF é o sistema de arquivos importado. No entanto, o uso do método IFileSystemImage::ImportSpecificFileSystem permite que a seleção específica do sistema de arquivos importe.
Observação
O método IFileSystemImage::IdentifyFileSystemsOnDisc pode ser usado para determinar quais sistemas de arquivos estão disponíveis no 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
Adicionando ou removendo arquivos ao sistema de arquivos
Depois de criar o objeto do sistema de arquivos e importar o sistema de arquivos da sessão anterior, chame os métodos IFileSystemImage::CreateFileItem e IFileSystemImage::CreateDirectoryItem para criar novos objetos de arquivo e diretório, respectivamente. Os objetos de arquivo e diretório fornecem detalhes específicos sobre os arquivos e diretórios. Como alternativa, o método IFsiDirectoryItem::AddTree de um objeto de diretório, representado por meio da interface IFsiDirectoryItem , pode ser usado para adicionar arquivos e diretórios existentes de outro dispositivo de armazenamento (ou seja, um disco rígido).
O método de atualização do manipulador de eventos disponível para IFileSystemImage identifica o arquivo atual que está sendo adicionado à imagem do sistema de arquivos, o número de setores já copiados e o número total de setores a serem copiados.
Para remover arquivos e diretórios existentes do sistema de arquivos, use os métodos IFsiDirectoryItem::Remove e IFsiDirectoryItem::RemoveTree dos objetos de diretório representados por meio da interface IFsiDirectoryItem . A propriedade IFileSystemImage::get_Root é usada para obter um ponteiro para o diretório raiz do sistema de arquivos e a interface IFsiDirectoryItem para percorrer a árvore de diretórios.
Observação
Os arquivos e diretórios removidos por meio dos métodos IFsiDirectoryItem::Remove e IFsiDirectoryItem::RemoveTree não são fisicamente removidos do disco e o software avançado pode recuperar facilmente as informações excluídas.
' Add the directory and its contents to the file system
WScript.Echo "Adding " & Path & " directory to the disc..."
FSI.Root.AddTree Path, false
Construindo uma imagem do sistema de arquivos
A etapa final é chamar IFileSystemImage::CreateResultImage para criar um fluxo de dados para a imagem de gravação e fornecer acesso a ela por meio da interface IFileSystemImageResult . Esse fluxo de dados pode ser fornecido diretamente para o método IDiscFormat2Data::Write ou ser salvo em um arquivo para uso posterior.
' Create an image from the file system image object
Dim Result
Set Result = FSI.CreateResultImage()
Stream = Result.ImageStream
Resumo de exemplo
O exemplo de script do Visual Basic a seguir mostra como usar objetos IMAPI para criar discos multissessão. O exemplo cria uma nova sessão e adiciona um diretório ao disco. Para simplificar, o código não executa uma verificação de erros abrangente e pressupõe o seguinte:
- Um dispositivo de disco compatível é instalado no sistema.
- O dispositivo de disco é a primeira unidade no sistema.
- Um disco compatível é inserido no dispositivo de disco.
- Os arquivos a serem adicionados ao disco estão localizados em "g:\burndir".
Funcionalidades adicionais, como verificação de erros extensiva, compatibilidade de dispositivo e mídia, notificação de eventos e cálculo de espaço livre no disco podem ser adicionadas ao script.
' 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
Tópicos relacionados