The ForceMediaToBeClosed
的财产IDiscFormat2Data
控制 IMAPI 是否终结光盘之后next write:
设置为 VARIANT_TRUE 将光盘标记为已关闭,以在下一个写入会话结束时禁止其他写入。
Image Mastering API 没有提供专门用于完成光盘的抽象,因此我们需要执行写入操作。如果我们打开,API 将在初始刻录期间最终确定空白光盘ForceMediaToBeClosed
与主要图像作家。对于现有的多会话光盘,我们需要附加另一个会话。
这是一个简单的 PowerShell 示例,我们可以尝试一下,这样我们就不需要构建项目。 C# 中的概念类似:
$drives = New-Object -ComObject 'IMAPI2.MsftDiscMaster2'
$recorder = New-Object -ComObject 'IMAPI2.MsftDiscRecorder2'
$recorder.InitializeDiscRecorder($drives[0]) # Choose a drive here
$disc = New-Object -ComObject 'IMAPI2.MsftDiscFormat2Data'
$disc.ClientName = 'PowerShell Recorder'
$disc.Recorder = $recorder
$disc.ForceMediaToBeClosed = $true # Finalize the next session
$image = New-Object -ComObject 'IMAPI2FS.MsftFileSystemImage'
if (!$disc.IsCurrentMediaSupported($recorder)) {
throw 'Disc is not writeable.'
} elseif ($disc.MediaHeuristicallyBlank) {
$image.ChooseImageDefaults($recorder)
} else {
$image.MultisessionInterfaces = $disc.MultisessionInterfaces
$image.ImportFileSystem() > $null
}
这将设置一些我们将在下面用来刻录光盘的样板。我们需要添加错误处理和功能检测以供实际使用,但作为演示它效果很好。如果我们将此代码粘贴或点源到 PowerShell 会话中,我们就可以交互地使用 COM 对象。
此时,如果我们检查空白或打开光盘的状态,我们应该看到值2
, 4
, or 6
对应于“空白”或“可附加”位掩码(6
对于两者)枚举IMAPI_FORMAT2_DATA_MEDIA_STATE.
PS> $disc.CurrentMediaStatus # 4 for an open, multi-session disc
然后,我们可以添加一些文件。如果我们只想关闭多会话光盘,则无需向映像添加任何内容。 API 使用空数据轨道记录会话的导入和导出。
PS> $image.Root.AddTree('path\to\root\folder', $false)
最后,我们将更改刻录到光盘上。因为我们设定$disc.ForceMediaToBeClosed
to $true
,此操作完成光盘,并且不允许进一步的写入操作:
PS> $disc.Write($image.CreateResultImage().ImageStream)
如果我们现在检查光盘状态,应该表明该光盘不可写:
PS> $disc.CurrentMediaStatus # 16384 or 40960
对于单会话光盘,我们应该看到16384
(0x4000
,“最终确定”)。我的系统报告40960
包含位的取消赎回权的多区段光盘0x2000
(“写保护”)和0x8000
(“不受支持的媒体”)。我们可能需要弹出或重新启动某些硬件才能在刻录后看到准确的值。
Remarks:
一般来说,多会话光盘上的每个会话都以导入开始并以导出结束。当我们最终完成光盘时,最后一个会话的导入将永久关闭介质以进行进一步写入。这就是为什么我们需要向未封闭的光盘附加一个额外的会话,即使我们没有更多的数据要添加。
如果可用空间低于 2%,IMAPI 将自动终结光盘。
-
InfraRecorder(问题中提到的工具)不使用 IMAPI。该应用程序提供了一个前端cdrtools直接控制设备IO。如果我们只需要完成未封闭的光盘,我们可能需要使用CD记录此软件包中包含 CLI 程序,以避免维护额外的代码库:
PS> cdrecord -scanbus # Show <drive> IDs to choose from
PS> cdrecord -fix dev=<drive> # Close an open session
作为一个简单的起点,我们可以通过以下方式完成多会话光盘:
PS> $session = cdrecord -msinfo dev=<drive>
PS> mkisofs -rJ -C $session -M <drive> 'path\to\root' | cdrecord dev=<drive> -
这实现了与使用 IMAPI 的 PowerShell 脚本相同的结果:我们导入最后一个会话,创建映像,然后刻录一个新会话来完成光盘。通过省略-multi
cdrecord 的参数,该命令不会以允许多会话光盘继续的方式写入导入。
虽然我们通常在类 Unix 系统上看到这个工具集,版本可用对于 Windows。
对于更高级的应用程序,我们可以使用较低级别的实现IDiscRecorderEx查询并向录音设备发送命令。