Vytvoření multisessionového disku
Rozhraní IMAGE Mastering API (IMAPI) podporuje přidávání a odebírání souborů do nebo z následujících vícesessionových typů disků:
- CD-R/CD-RW
- Single-Layer DVD+R/DVD-R
- DVD+R dvouvrstvé
- BD-R
- DVD-RW/DVD+RW (Jen Windows 7)
- DVD-RAM (Pouze pro Windows 7)
- BD-RE (Windows 7 Pouze)
Vytvoření multisessionového disku pomocí IMAPI se skládá z následujících kroků. Každý z těchto zdokumentovaných kroků obsahuje příslušnou část kompletního příkladu skriptu jazyka Visual Basic, který je uvedený v poslední části.
Inicializace záznamu disku
Před inicializací zařízení MsftDiscMaster2 objekt poskytuje výčet optických zařízení v systému. Rozhraní IDiscMaster2 poskytuje přístup k tomuto výčtu zařízení pro usnadnění umístění příslušného záznamového zařízení. Objekt MsftDiscMaster2 také poskytuje oznámení událostí při přidání nebo odebrání optických zařízení z počítače.
Po vyhledání optického záznamu a načtení přiřazeného ID vytvořte nový MsftDiscMaster2 objekt a inicializujete záznam pomocí konkrétního ID zařízení.
Rozhraní IDiscRecorder2 poskytuje přístup k základním informacím o zařízení, jako je ID dodavatele, ID produktu, revize produktu a také metody pro vysunutí média nebo zavření zásobníku.
Poznámka
Další konstanty a dimenze deklarované v následující ukázce se později použijí v kompletním ukázkovém skriptu umístěném v poslední části tohoto dokumentu. Tyto prvky nejsou vyžadovány pro inicializaci záznamu disku.
' *** 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)
Vytvoření zapisovače dat
MsftDiscFormat2Data objekt poskytuje metodu zápisu, jeho vlastnosti a také vlastnosti specifické pro média. Rozhraní IDiscFormat2Data poskytuje přístup k tomuto objektu.
Záznamník disku se váže na formátového zapisovače pomocí vlastnosti IDiscFormat2Data::put_Recorder. Jakmile je rekordér vázán na zapisovač formátu, lze před zápisem výsledného obrazu na disk pomocí metody IDiscFormat2Data::Write provádět dotazy specifické pro média a zápis.
Poznámka
Řetězec názvu klienta zadaný v níže uvedeném vzorovém kódu by se měl upravit podle potřeby pro konkrétní aplikaci.
' Create a DiscFormat2Data object and set the recorder
Dim DataWriter
Set DataWriter = CreateObject ("IMAPI2.MsftDiscFormat2Data")
DataWriter.Recorder = Recorder
DataWriter.ClientName = "IMAPIv2 TEST"
Vytvoření objektu systému souborů
Aby bylo možné zaznamenat novou relaci, musí se pro ni nejprve vygenerovat burn image. Zaváděcí obraz pro formáty ISO9660, Joliet a UDF se skládá ze systémů souborů jednotlivých souborů a adresářů. MsftFileSystemImage objekt je objekt systému souborů, který obsahuje soubory a adresáře, které mají být umístěny na optické médium. Rozhraní IFileSystemImage poskytuje přístup k objektu a nastavení systému souborů.
' Create a new file system image object
Dim FSI
Set FSI = CreateObject("IMAPI2FS.MsftFileSystemImage")
Import systému souborů
Než budete pokračovat, ujistěte se, že disk není prázdný kontrolou vlastnosti IDiscFormat2::get_MediaHeuristicallyBlank.
Po vytvoření objektu MsftFileSystemImage by se měla inicializovat vlastnost IFileSystemImage::put_MultisessionInterfaces před voláním buď metody IFileSystemImage::ImportFileSystem nebo IFileSystemImage::ImportSpecificFileSystem k importu systému souborů z poslední zaznamenané relace. Tyto metody automaticky naplní objekt MsftFileSystemImage informacemi popisující dříve zaznamenané soubory a adresáře.
Poznámka
Vlastnost IFileSystemImage::put_MultisessionInterfaces je obvykle inicializována pomocí multisession rozhraní poskytovaných zapisovačem dat prostřednictvím vlastnosti IDiscFormat2Data::get_MultisessionInterfaces.
Pokusy o nastavení vlastnosti IFileSystemImage::put_MultisessionInterfaces selžou, pokud IMAPI nepodporuje vícesložkovou relaci pro aktuálně vložená média nebo tato média nelze připojit z jiného důvodu (např. protože jsou uzavřená).
Pokud předchozí relace vypalování obsahovala více než jeden typ systému souborů, IFileSystemImage::ImportFileSystem metoda importuje informace z nejpokročilejšího typu systému souborů. Například v příkladu uvedeném v tomto tématu je UDF importovaný systém souborů. Použití IFileSystemImage::ImportSpecificFileSystem metoda umožňuje konkrétní výběr systému souborů importovat.
Poznámka
Metodu IFileSystemImage::IdentifyFileSystemsOnDisc lze použít k určení, které systémy souborů jsou na disku k dispozici.
' 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
Přidání nebo odebrání souborů do systému souborů
Po vytvoření objektu systému souborů a importu systému souborů z předchozí relace zavolejte metody IFileSystemImage::CreateFileItem a IFileSystemImage::CreateDirectoryItem k vytvoření nových objektů souborů a adresářů. Objekty souborů a adresářů poskytují konkrétní podrobnosti o souborech a adresářích. Alternativně lze metodu IFsiDirectoryItem::AddTree objektu adresáře reprezentovanou prostřednictvím rozhraní IFsiDirectoryItem použít k přidání existujících souborů a adresářů z jiného úložného zařízení (tj. pevného disku).
Metoda aktualizace obslužné rutiny události dostupná pro IFileSystemImage identifikuje aktuální soubor přidaný do image systému souborů, počet sektorů, které jsou již zkopírovány, a celkový počet sektorů, které se mají zkopírovat.
Chcete-li odebrat existující soubory a adresáře ze systému souborů, použijte IFsiDirectoryItem::Remove a IFsiDirectoryItem::RemoveTree metody objektů adresáře reprezentované prostřednictvím IFsiDirectoryItem rozhraní. Vlastnost IFileSystemImage::get_Root slouží k získání ukazatele na kořenový adresář systému souborů a rozhraní IFsiDirectoryItem pro procházení stromem adresáře.
Poznámka
Soubory a adresáře odebrané prostřednictvím IFsiDirectoryItem::Remove a IFsiDirectoryItem::RemoveTree metody nejsou fyzicky odebrány z disku a pokročilý software může snadno obnovit odstraněné informace.
' Add the directory and its contents to the file system
WScript.Echo "Adding " & Path & " directory to the disc..."
FSI.Root.AddTree Path, false
Vytvoření obrazu souborového systému
Posledním krokem je volání IFileSystemImage::CreateResultImage pro vytvoření datového proudu pro vypalovací image a umožnění přístupu k němu prostřednictvím IFileSystemImageResult rozhraní. Tento datový proud lze poskytnout buď přímo do metody IDiscFormat2Data::Write, nebo uložit do souboru pro pozdější použití.
' Create an image from the file system image object
Dim Result
Set Result = FSI.CreateResultImage()
Stream = Result.ImageStream
Příklad souhrnu
Následující příklad skriptu jazyka Visual Basic ukazuje, jak pomocí objektů IMAPI vytvořit vícesessionní disky. Příklad vytvoří novou relaci a přidá adresář na disk. Kvůli jednoduchosti kód neprovádí rozsáhlou kontrolu chyb a předpokládá následující:
- V systému je nainstalováno kompatibilní diskové zařízení.
- Diskové zařízení je první jednotka v systému.
- Do zařízení disku se vloží kompatibilní disk.
- Soubory, které se mají přidat na disk, se nacházejí v umístění g:\burndir.
Do skriptu je možné přidat další funkce, jako je rozsáhlá kontrola chyb, kompatibilita zařízení a média, oznámení o událostech a výpočet volného místa na disku.
' 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
Související témata