Erstellen eines Datenträgers mit mehreren Sitzungen

Die Image Mastering API (IMAPI) unterstützt das Hinzufügen und Entfernen von Dateien zu oder aus den folgenden Datenträgertypen mit mehreren Sitzungen:

  • CD-R/CD-RW
  • Single-Layer DVD+R/DVD-R
  • DVD+R Dual Layer
  • BD-R
  • DVD-RW/DVD+RW (nur Windows 7)
  • DVD-RAM (nur Windows 7)
  • BD-RE (nur Windows 7)

Die Erstellung eines Multisession-Datenträgers mit IMAPI umfasst die folgenden Schritte. Jeder dieser dokumentierten Schritte enthält den relevanten Teil des vollständigen Visual Basic-Skriptbeispiels im letzten Abschnitt.

Initialisieren des Disc Recorders

Vor der Geräteinitialisierung stellt das MsftDiscMaster2-Objekt eine Enumeration der optischen Geräte im System bereit. Die IDiscMaster2-Schnittstelle bietet Zugriff auf diese Geräteenumeration, um die Position des entsprechenden Aufzeichnungsgeräts zu vereinfachen. Das MsftDiscMaster2-Objekt stellt auch Ereignisbenachrichtigungen bereit, wenn optische Geräte einem Computer hinzugefügt oder daraus entfernt werden.

Nachdem Sie einen optischen Recorder gesucht und die ihm zugewiesene ID abgerufen haben, erstellen Sie ein neues MsftDiscMaster2-Objekt , und initialisieren Sie den Recorder mithilfe der spezifischen Geräte-ID.

Die IDiscRecorder2-Schnittstelle bietet Zugriff auf grundlegende Geräteinformationen wie z. B. Hersteller-ID, Produkt-ID, Produktrevision sowie die Methoden zum Auswerfen oder Schließen des Fachs.

Hinweis

Die im folgenden Beispiel deklarierten zusätzlichen Konstanten und Dimensionen werden später im vollständigen Beispielskript im letzten Abschnitt dieses Dokuments verwendet. Diese Elemente sind für die Initialisierung eines Datenträgerrekorders nicht erforderlich.

 

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

Erstellen eines Datenschreibers

Das MsftDiscFormat2Data-Objekt stellt die Schreibmethode, ihre Eigenschaften sowie die medienspezifischen Eigenschaften bereit. Die IDiscFormat2Data-Schnittstelle bietet Zugriff auf dieses Objekt.

Der Disc Recorder wird mithilfe der IDiscFormat2Data::p ut_Recorder-Eigenschaft an den Formatwriter gebunden. Nachdem der Recorder an den Formatwriter gebunden wurde, können medien- und schreibspezifische Eigenschaftenabfragen ausgeführt werden, bevor das Ergebnisbild mithilfe der IDiscFormat2Data::Write-Methode auf den Datenträger geschrieben wird.

Hinweis

Die im folgenden Beispielcode angegebene Clientnamenzeichenfolge sollte entsprechend der spezifischen Anwendung angepasst werden.

 

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

Erstellen des Dateisystemobjekts

Um eine neue Sitzung aufzuzeichnen, muss zuerst ein Brennbild für sie generiert werden. Ein Brennimage für die Formate ISO9660, Joliet und UDF besteht aus Dateisystemen einzelner Dateien und Verzeichnisse. Das MsftFileSystemImage-Objekt ist das Dateisystemobjekt, das die Dateien und Verzeichnisse enthält, die auf den optischen Medien platziert werden sollen. Die IFileSystemImage-Schnittstelle bietet Zugriff auf das Dateisystemobjekt und die Einstellungen.

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

Importieren eines Dateisystems

Bevor Sie fortfahren, stellen Sie sicher, dass der Datenträger nicht leer ist, indem Sie die Eigenschaft IDiscFormat2::get_MediaHeuristicallyBlank überprüfen.

Nach dem Erstellen des MsftFileSystemImage-Objekts sollte die IFileSystemImage::p ut_MultisessionInterfaces-Eigenschaft vor einem Aufruf der IFileSystemImage::ImportFileSystem-Methode oder der IFileSystemImage::ImportSpecificFileSystem-Methode initialisiert werden, um das Dateisystem aus der letzten aufgezeichneten Sitzung zu importieren. Diese Methoden füllen das MsftFileSystemImage-Objekt automatisch mit Informationen auf, die die zuvor aufgezeichneten Dateien und Verzeichnisse beschreiben.

Hinweis

Die IFileSystemImage::p ut_MultisessionInterfaces-Eigenschaft wird in der Regel mit den Multisessionschnittstellen initialisiert, die vom Datenschreiber über die IDiscFormat2Data::get_MultisessionInterfaces-Eigenschaft bereitgestellt werden.

 

Versuche, die IFileSystemImage::p ut_MultisessionInterfaces-Eigenschaft festzulegen, schlagen fehl, wenn IMAPI die Multisession für die aktuell eingefügten Medien nicht unterstützt oder die Medien aus einem anderen Grund nicht angefügt werden können (z. B. weil es geschlossen ist).

Wenn die vorherige Brennsitzung mehr als einen Dateisystemtyp enthielt, importiert die IFileSystemImage::ImportFileSystem-Methode Informationen aus dem fortschrittlichsten Dateisystemtyp. Im Beispiel in diesem Thema ist UDF beispielsweise das importierte Dateisystem. Die Verwendung der IFileSystemImage::ImportSpecificFileSystem-Methode ermöglicht jedoch die spezifische Auswahl des zu importierenden Dateisystems.

Hinweis

Die IFileSystemImage::IdentifyFileSystemsOnDisc-Methode kann verwendet werden, um zu bestimmen, welche Dateisysteme auf dem Datenträger verfügbar sind.

 

    ' 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

Hinzufügen oder Entfernen von Dateien zum Dateisystem

Nachdem Sie das Dateisystemobjekt erstellt und das Dateisystem aus der vorherigen Sitzung importiert haben, rufen Sie die Methoden IFileSystemImage::CreateFileItem und IFileSystemImage::CreateDirectoryItem auf, um neue Datei- bzw. Verzeichnisobjekte zu erstellen. Die Datei- und Verzeichnisobjekte bieten spezifische Details zu den Dateien und Verzeichnissen. Alternativ kann die IFsiDirectoryItem::AddTree-Methode eines Verzeichnisobjekts, dargestellt über die IFsiDirectoryItem-Schnittstelle , verwendet werden, um vorhandene Dateien und Verzeichnisse von einem anderen Speichergerät (d. h. einer Festplatte) hinzuzufügen.

Die für IFileSystemImage verfügbare Updatemethode des Ereignishandlers identifiziert die aktuelle Datei, die dem Dateisystemimage hinzugefügt wird, die Anzahl der bereits kopierten Sektoren und die Gesamtzahl der zu kopierenden Sektoren.

Um vorhandene Dateien und Verzeichnisse aus dem Dateisystem zu entfernen, verwenden Sie die Methoden IFsiDirectoryItem::Remove und IFsiDirectoryItem::RemoveTree der Verzeichnisobjekte, die über die IFsiDirectoryItem-Schnittstelle dargestellt werden. Die IFileSystemImage::get_Root-Eigenschaft wird verwendet, um einen Zeiger auf das Stammverzeichnis des Dateisystems und die IFsiDirectoryItem-Schnittstelle abzurufen, um die Verzeichnisstruktur zu durchlaufen.

Hinweis

Dateien und Verzeichnisse, die über die Methoden IFsiDirectoryItem::Remove und IFsiDirectoryItem::RemoveTree entfernt werden, werden nicht physisch von der Festplatte entfernt, und erweiterte Software kann die gelöschten Informationen problemlos wiederherstellen.

 

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

Erstellen eines Dateisystemimages

Der letzte Schritt besteht darin, IFileSystemImage::CreateResultImage aufzurufen, um einen Datenstrom für das Brennbild zu erstellen und über die IFileSystemImageResult-Schnittstelle Darauf zuzugreifen. Dieser Datenstrom kann entweder direkt für die IDiscFormat2Data::Write-Methode bereitgestellt oder zur späteren Verwendung in einer Datei gespeichert werden.

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

Beispielzusammenfassung

Das folgende Visual Basic-Skriptbeispiel zeigt, wie SIE IMAPI-Objekte verwenden, um Datenträger mit mehreren Sitzungen zu erstellen. Im Beispiel wird eine neue Sitzung erstellt und dem Datenträger ein Verzeichnis hinzugefügt. Der Einfachheit halber führt der Code keine umfassende Fehlerüberprüfung durch und setzt Folgendes voraus:

  • Auf dem System ist ein kompatibles Datenträgergerät installiert.
  • Das Datenträgergerät ist das erste Laufwerk im System.
  • Ein kompatibler Datenträger wird in das Datenträgergerät eingefügt.
  • Dateien, die dem Datenträger hinzugefügt werden sollen, befinden sich in "g:\burndir".

Zusätzliche Funktionen wie umfangreiche Fehlerüberprüfungen, Geräte- und Medienkompatibilität, Ereignisbenachrichtigungen und die Berechnung des freien Speicherplatzes auf dem Datenträger können dem Skript hinzugefügt werden.

' 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

Verwenden von IMAPI

IStream

IDiscMaster2

IDiscFormat2Data

IFileSystemImage