Création d’un disque multisession
L’API IMAPI ( Image Mastering API ) prend en charge l’ajout et la suppression de fichiers vers ou à partir des types de disques multisession suivants :
- CD-R/CD-RW
- Single-Layer DVD+R/DVD-R
- DOUBLE COUCHE DVD+R
- BD-R
- DVD-RW/DVD+RW (Windows 7 uniquement)
- DVD-RAM (Windows 7 uniquement)
- BD-RE (Windows 7 uniquement)
La création d’un disque multisession à l’aide d’IMAPI se compose des étapes suivantes. Chacune de ces étapes documentées contient la partie pertinente de l’exemple complet de script Visual Basic fourni dans la dernière section.
Initialisation de l’enregistreur de disque
Avant l’initialisation de l’appareil, l’objet MsftDiscMaster2 fournit une énumération des appareils optiques sur le système. L’interface IDiscMaster2 permet d’accéder à cette énumération d’appareil pour faciliter l’emplacement de l’appareil d’enregistrement approprié. L’objet MsftDiscMaster2 fournit également des notifications d’événements lorsque des appareils optiques sont ajoutés ou supprimés d’une machine.
Après avoir localisé un enregistreur optique et récupéré l’ID qui lui a été attribué, créez un objet MsftDiscMaster2 et initialisez l’enregistreur à l’aide de l’ID d’appareil spécifique.
L’interface IDiscRecorder2 permet d’accéder aux informations de base de l’appareil telles que l’ID du fournisseur, l’ID de produit, la révision du produit, ainsi que les méthodes permettant d’éjecter le média ou de fermer la barre d’état.
Notes
Les constantes et dimensions supplémentaires déclarées dans l’exemple suivant sont utilisées plus loin dans l’exemple de script complet situé dans la dernière section de ce document. Ces éléments ne sont pas requis pour l’initialisation d’un enregistreur de disque.
' *** 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)
Création d’un enregistreur de données
L’objet MsftDiscFormat2Data fournit la méthode d’écriture, ses propriétés, ainsi que les propriétés spécifiques au média. L’interface IDiscFormat2Data permet d’accéder à cet objet.
L’enregistreur de disques se lie au enregistreur de format à l’aide de la propriété IDiscFormat2Data::p ut_Recorder . Une fois que l’enregistreur est lié au enregistreur de format, des requêtes de propriété spécifiques au média et à l’écriture peuvent être effectuées avant d’écrire l’image de résultat sur un disque à l’aide de la méthode IDiscFormat2Data::Write .
Notes
La chaîne de nom de client spécifiée dans l’exemple de code ci-dessous doit être ajustée en fonction de l’application spécifique.
' Create a DiscFormat2Data object and set the recorder
Dim DataWriter
Set DataWriter = CreateObject ("IMAPI2.MsftDiscFormat2Data")
DataWriter.Recorder = Recorder
DataWriter.ClientName = "IMAPIv2 TEST"
Création de l’objet Système de fichiers
Pour enregistrer une nouvelle session, une image gravée doit d’abord être générée pour celle-ci. Une image gravée pour les formats ISO9660, Joliet et UDF se compose de systèmes de fichiers de fichiers et de répertoires individuels. L’objet MsftFileSystemImage est l’objet de système de fichiers qui contient les fichiers et les répertoires à placer sur le support optique. L’interface IFileSystemImage permet d’accéder à l’objet et aux paramètres du système de fichiers.
' Create a new file system image object
Dim FSI
Set FSI = CreateObject("IMAPI2FS.MsftFileSystemImage")
Importation d’un système de fichiers
Avant de continuer, vérifiez que le disque n’est pas vide en vérifiant la propriété IDiscFormat2::get_MediaHeuristicallyBlank .
Après avoir créé l’objet MsftFileSystemImage , la propriété IFileSystemImage::p ut_MultisessionInterfaces doit être initialisée avant un appel à la méthode IFileSystemImage::ImportFileSystem ou IFileSystemImage::ImportSpecificFileSystemSystem pour importer le système de fichiers à partir de la dernière session enregistrée. Ces méthodes renseignent automatiquement l’objet MsftFileSystemImage avec des informations décrivant les fichiers et répertoires précédemment enregistrés.
Notes
La propriété IFileSystemImage::p ut_MultisessionInterfaces est généralement initialisée avec les interfaces multisession fournies par l’enregistreur de données via la propriété IDiscFormat2Data::get_MultisessionInterfaces .
Les tentatives de définition de la propriété IFileSystemImage::p ut_MultisessionInterfaces échouent si IMAPI ne prend pas en charge la multisession pour le média actuellement inséré ou si le média ne peut pas être ajouté pour une autre raison (par exemple, parce qu’il est fermé).
Si la session de gravure précédente contenait plusieurs types de système de fichiers, la méthode IFileSystemImage::ImportFileSystem importera les informations du type de système de fichiers le plus avancé présent. Par exemple, dans l’exemple fourni dans cette rubrique, UDF est le système de fichiers importé. Toutefois, l’utilisation de la méthode IFileSystemImage::ImportSpecificFileSystem permet la sélection spécifique du système de fichiers à importer.
Notes
La méthode IFileSystemImage::IdentifierFileSystemsOnDisc peut être utilisée pour déterminer les systèmes de fichiers disponibles sur le disque.
' 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
Ajout ou suppression de fichiers dans le système de fichiers
Après avoir créé l’objet système de fichiers et importé le système de fichiers à partir de la session précédente, appelez les méthodes IFileSystemImage::CreateFileItem et IFileSystemImage::CreateDirectoryItem pour créer des objets de fichier et de répertoire, respectivement. Les objets fichier et répertoire fournissent des détails spécifiques sur les fichiers et les répertoires. Vous pouvez également utiliser la méthode IFsiDirectoryItem::AddTree d’un objet de répertoire, représenté via l’interface IFsiDirectoryItem , pour ajouter des fichiers et des répertoires existants à partir d’un autre périphérique de stockage (par exemple, un disque dur).
La méthode de mise à jour du gestionnaire d’événements disponible pour IFileSystemImage identifie le fichier en cours d’ajout à l’image du système de fichiers, le nombre de secteurs déjà copiés et le nombre total de secteurs à copier.
Pour supprimer des fichiers et des répertoires existants du système de fichiers, utilisez les méthodes IFsiDirectoryItem::Remove et IFsiDirectoryItem::RemoveTree des objets de répertoire représentés via l’interface IFsiDirectoryItem . La propriété IFileSystemImage::get_Root permet d’obtenir un pointeur vers le répertoire racine du système de fichiers et l’interface IFsiDirectoryItem pour parcourir l’arborescence de répertoires.
Notes
Les fichiers et répertoires supprimés via les méthodes IFsiDirectoryItem::Remove et IFsiDirectoryItem::RemoveTree ne sont pas physiquement supprimés du disque, et les logiciels avancés peuvent facilement récupérer les informations supprimées.
' Add the directory and its contents to the file system
WScript.Echo "Adding " & Path & " directory to the disc..."
FSI.Root.AddTree Path, false
Construction d’une image de système de fichiers
La dernière étape consiste à appeler IFileSystemImage::CreateResultImage pour créer un flux de données pour l’image gravée et lui fournir l’accès via l’interface IFileSystemImageResult . Ce flux de données peut être fourni directement à la méthode IDiscFormat2Data::Write ou être enregistré dans un fichier pour une utilisation ultérieure.
' Create an image from the file system image object
Dim Result
Set Result = FSI.CreateResultImage()
Stream = Result.ImageStream
Exemple de résumé
L’exemple de script Visual Basic suivant montre comment utiliser des objets IMAPI pour créer des disques multisession. L’exemple crée une session et ajoute un répertoire au disque. Par souci de simplicité, le code n’effectue pas de vérification approfondie des erreurs et suppose ce qui suit :
- Un périphérique à disque compatible est installé sur le système.
- Le périphérique à disque est le premier lecteur du système.
- Un disque compatible est inséré dans le périphérique à disque.
- Les fichiers à ajouter au disque se trouvent dans « g:\burndir ».
Des fonctionnalités supplémentaires telles que la vérification étendue des erreurs, la compatibilité des appareils et des médias, la notification d’événement et le calcul de l’espace libre sur le disque peuvent être ajoutées au 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
Rubriques connexes