Criando um disco de várias sessões
O Image Mastering API (IMAPI) suporta a adição e remoção de arquivos para, ou de, os seguintes tipos de disco multisessão:
- CD-R/CD-RW
- Single-Layer DVD+R/DVD-R
- DVD+R Camada Dupla
- BD-R
- DVD-RW/DVD+RW (Apenas para Windows 7)
- DVD-RAM (Windows 7 Apenas)
- BD-RE (Apenas Windows 7)
A criação de um disco multisessão usando IMAPI consiste nas seguintes etapas. 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 óticos no sistema. A interface IDiscMaster2 fornece acesso à enumeração deste dispositivo para facilitar a localização do dispositivo de gravação apropriado. O objeto MsftDiscMaster2 também fornece notificações de eventos quando dispositivos óticos são adicionados ou removidos de uma máquina.
Depois de localizar um gravador ótico e recuperar o ID atribuído a ele, crie um novo objeto MsftDiscMaster2 e inicialize o gravador usando o ID de dispositivo específico.
A interface IDiscRecorder2 fornece acesso a informações básicas do dispositivo, tais como ID do fornecedor, ID do produto, revisão do produto, bem como 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 gravação, suas propriedades, bem como as propriedades específicas da mídia. O interface IDiscFormat2Data fornece acesso a esse objeto.
O gravador de disco liga-se ao escritor de formato usando a propriedade IDiscFormat2Data::put_Recorder. Depois de o gravador estar vinculado ao escritor de formato, consultas de propriedade específicas de mídia e gravação podem ser realizadas antes de gravar a imagem de resultado em disco usando o método IDiscFormat2Data::Write.
Observação
A cadeia de caracteres do 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 de sistema de arquivos
Para gravar uma nova sessão, uma imagem de gravação deve ser gerada para ela primeiro. Uma imagem gravada para ISO9660, Joliet e formatos UDF consistem 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, certifique-se de que o disco não está em branco ao verificar a propriedade IDiscFormat2::get_MediaHeuristicallyBlank.
Depois de criar o objeto MsftFileSystemImage, a propriedade IFileSystemImage::put_MultisessionInterfaces deve ser inicializada antes de uma chamada aos métodos 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::put_MultisessionInterfaces normalmente é inicializada com as interfaces de sessões múltiplas fornecidas pelo gravador de dados por meio da propriedade IDiscFormat2Data::get_MultisessionInterfaces.
As tentativas de definir a propriedade IFileSystemImage::put_MultisessionInterfaces falharão se o IMAPI não suportar multisessão para o suporte inserido no momento ou se o suporte não puder ser acrescentado por algum outro motivo (por exemplo, porque está fechado).
Se a sessão de gravação anterior contiver mais de um tipo de sistema de arquivos, o métodoIFileSystemImage::ImportFileSystemimportará 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étodoIFileSystemImage::ImportSpecificFileSystempermite a seleção específica do sistema de arquivos a ser importado.
Observação
O métodoIFileSystemImage::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 o IFileSystemImage::CreateFileItem e IFileSystemImage::CreateDirectoryItem métodos 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 interfaceIFsiDirectoryItem, 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, utilize os métodos IFsiDirectoryItem::Remove e IFsiDirectoryItem::RemoveTree nos objetos de diretório representados através 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
Arquivos e diretórios removidos através do IFsiDirectoryItem::Remove e IFsiDirectoryItem::RemoveTree métodos não são fisicamente removidos do disco e o software avançado pode facilmente recuperar 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 gravada e fornecer acesso a ela por meio da interfaceIFileSystemImageResult. Esse fluxo de dados pode ser fornecido diretamente ao método IDiscFormat2Data::Writeou 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 do exemplo
O exemplo de script do Visual Basic a seguir mostra como usar objetos IMAPI para criar discos de várias sessões. O exemplo cria uma nova sessão e adiciona um diretório ao disco. Por uma questão de simplicidade, o código não executa uma extensa verificação de erros e pressupõe o seguinte:
- Um dispositivo de disco compatível está instalado no sistema.
- O dispositivo de disco é o primeiro drive no sistema.
- Um disco compatível é inserido no dispositivo de disco.
- Os ficheiros a adicionar ao disco estão localizados em "g:\burndir".
Funcionalidades adicionais, como extensa verificação de erros, compatibilidade de dispositivos e mídias, 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