- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
首先,对术语进行一些澄清。 完成,我并不是说结束 session ;我的意思是在 CD 或 DVD 上以这样一种方式写入导出,即无法再通过通常的方式(Roxio、Nero、Windows Explorer 等)向其中添加信息
我对此进行了大量研究。有一些开源程序,例如 InfraRecorder我们可以从中得到一些启发,但它们似乎都涉及使用 IMAPI 的相当复杂的 C++ 代码,这似乎是一种非常低级的做事方式。我们团队中的开发人员都没有 C++ 或 IMAPI 专业知识来支持这样的代码库。
互联网上最有前途的资源似乎是 this one ,但它似乎不包含最终确定功能。这是“写入图像”的代码:
public void WriteImage(BurnVerificationLevel verification, bool finalize, bool eject)
{
if (!_recorderLoaded)
throw new InvalidOperationException("LoadMedia must be called first.");
MsftDiscRecorder2 recorder = null;
MsftDiscFormat2Data discFormatData = null;
try
{
recorder = new MsftDiscRecorder2();
recorder.InitializeDiscRecorder(_recorders.SelectedItem.InternalUniqueId);
discFormatData = new MsftDiscFormat2Data
{
Recorder = recorder,
ClientName = ClientName,
ForceMediaToBeClosed = finalize
};
//
// Set the verification level
//
var burnVerification = (IBurnVerification)discFormatData;
burnVerification.BurnVerificationLevel = IMAPI_BURN_VERIFICATION_LEVEL.IMAPI_BURN_VERIFICATION_NONE;
//
// Check if media is blank, (for RW media)
//
object[] multisessionInterfaces = null;
if (!discFormatData.MediaHeuristicallyBlank)
multisessionInterfaces = discFormatData.MultisessionInterfaces;
//
// Create the file system
//
IStream fileSystem;
_CreateImage(recorder, multisessionInterfaces, out fileSystem);
discFormatData.Update += _discFormatWrite_Update;
//
// Write the data
//
try
{
discFormatData.Write(fileSystem);
}
finally
{
if (fileSystem != null) Marshal.FinalReleaseComObject(fileSystem);
}
discFormatData.Update -= _discFormatWrite_Update;
if (eject) recorder.EjectMedia();
}
finally
{
_isWriting = false;
if (discFormatData != null) Marshal.ReleaseComObject(discFormatData);
if (recorder != null) Marshal.ReleaseComObject(recorder);
}
}
代码的关键部分似乎是这个:
discFormatData = new MsftDiscFormat2Data
{
Recorder = recorder,
ClientName = ClientName,
ForceMediaToBeClosed = finalize // <-- Here
};
但这不是终结函数;它是一种将实际数据刻录到磁盘上的功能。您是否必须实际创建一个新 session 才能在现有磁盘上执行终结?
最佳答案
IDiscFormat2Data
的ForceMediaToBeClosed
属性controls whether the IMAPI finalizes the disc在下一个之后写:
Set to VARIANT_TRUE to mark the disc as closed to prohibit additional writes when the next write session ends.
Image Mastering API 没有提供专门用于完成光盘的抽象,因此我们需要执行写入操作。如果我们用主图像写入器打开 ForceMediaToBeClosed
,API 将在初始刻录期间完成一张空白光盘。对于现有的多区段光盘,我们需要追加另一个区段。
这是一个简单的 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 session 中,我们就可以交互地使用 COM 对象。
此时,如果我们检查空白或打开光盘的状态,我们应该看到值 2
、4
或 6
对应于 IMAPI_FORMAT2_DATA_MEDIA_STATE
上枚举的“空白”或“可附加”位掩码(6
) .
PS> $disc.CurrentMediaStatus # 4 for an open, multi-session disc
然后,我们可以添加一些文件。如果我们只想关闭多区段光盘,则不需要向图像添加任何内容。 API以空数据轨道记录 session 的引入和引出。
PS> $image.Root.AddTree('path\to\root\folder', $false)
最后,我们会将更改刻录到光盘上。因为我们将 $disc.ForceMediaToBeClosed
设置为 $true
,所以此操作最终确定了光盘,并且不允许进一步的写入操作:
PS> $disc.Write($image.CreateResultImage().ImageStream)
如果我们现在检查光盘状态,它应该表明光盘是不可写的:
PS> $disc.CurrentMediaStatus # 16384 or 40960
对于单区段光盘,我们应该看到 16384
(0x4000
,“finalized”)。对于包含位 0x2000
(“写保护”)和 0x8000
(“不受支持的媒体”),我的系统报告 40960
”)。我们可能需要弹出或重启某些硬件才能在刻录后看到准确的值。
备注:
一般来说,多区段光盘上的每个区段都以导入开始,以导出结束。当我们完成光盘时,最后一个 session 的导入会永久关闭媒体以进一步写入。这就是为什么即使我们没有更多数据要添加,我们也需要将额外的 session 附加到未关闭的光盘。
如果可用空间低于 2%,IMAPI 将自动终结光盘。
InfraRecorder(问题中提到的工具)不使用 IMAPI。此应用程序为 cdrtools 提供了一个前端直接控制设备IO。如果我们只需要完成未关闭的光盘,我们可能需要使用 cdrecord此软件包中包含 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 脚本相同的结果:我们导入最后一个 session ,创建镜像,然后刻录一个新 session 以完成光盘。通过省略 cdrecord 的 -multi
参数,该命令不会以允许多区段光盘继续的方式写入导入。
虽然我们通常在类 Unix 系统上看到这个工具集,builds are available适用于 Windows。
对于更高级的应用程序,我们可以使用较低级别的实现 IDiscRecorderEx
向记录设备查询和发送命令。
关于c# - 在 C# 或 PowerShell 中是否有一种相对直接的方法来完成 CD 或 DVD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47639770/
我正在寻找实现 PowerShell 提供程序 在 电源外壳。 我一直在想,如果我只是定义类型,然后将它们导入我的 session (导入模块),我应该能够让它们可用。 例如,这个 不工作但它沿着我想
我创建的脚本使用了组件,这些组件仅在32位版本的Powershell中可用。 默认情况下,Windows使用Powershell x64执行脚本,这会导致一些错误。 是一种在脚本开头设置值以强制Win
是否可以从 Powershell 中检测它是否是嵌套 shell? 如果我打开 Powershell 或 cmd.exe 窗口,然后输入 powershell 在那里,是否有一个神奇的 $host.s
随着 PowerShell Core 的发布,应用程序在使用托管自动化库 (system.management.automation) 时如何选择调用哪个版本的 Powershell(Powershe
最近,我加入了我企业的 Windows 团队,凭借我的开发人员背景(一般是 Java、.NET 和 Web),我很快就对 PowerShell 产生了兴趣。我可以看到它比普通的旧批处理文件、VB 更有
假设我有一个 powershell 脚本,它在我当前路径的相对路径中包含一个 Powershell 哈希。让我们称之为“name.ps1”,它包含: $names = @{ "bob" = "b
我想为我正在构建的自定义 Powershell Commandlet 使用 SqlServerCmdletSnapin。如果我将以下代码添加到 PSM1 的开头: if ( (Get-PSSnapin
如何调用从 PowerShell 脚本中获取命名参数的 PowerShell 脚本? foo.ps1: param( [Parameter(Mandatory=$true)][String]$a=''
我即将为 Windows 管理员编写一个 PowerShell 脚本,以帮助他们完成与部署 Web 应用程序相关的某些任务。 有什么理由让我应该赞成或排除开发 PowerShell 模块 (.psm1
我的 powershell 模块有一个函数,我希望它返回一个非零退出代码。但是,作为一个模块函数,当我运行 Import-Module 时,它会加载到 powershell 控制台的上下文中。所以,当
我在这个问题上花了最后 4 个小时,非常感谢您提供的任何意见。 我需要使用不同的凭据调用 powershell 脚本并将参数传递给该脚本。 安装 WISEScript 中包装的程序后,此脚本开始收集机
我有一个场景,我需要将 powershell 命令的命令和输出转发到另一个进程以进行日志记录和处理。 我希望这个控制台尽可能接近 powershell,因此不希望将它简单地托管在另一个控制台程序中。
我正在尝试让一个主 PowerShell 脚本运行所有其他脚本,同时等待 30-60 秒以确保完成任务。我尝试过的所有其他操作都不会停止/等待第一个脚本及其进程完成,然后才能同时完成所有其他脚本,并且
我正在编写一个脚本来使用多个 plink (PuTTY) session 作为 Windows 版本的 clustersh。然而,我陷入困境,因为我想从 powershell 打开多个 Powersh
我读了这个答案:How to Open Powershell from Powershell start powershell 这将打开基础的大分辨率 PS 实例。如何打开 PS(x86)? 最佳答案
我很想知道我们是否可以在 Powershell 中做到这一点。 使用 Out-File 命令,我们可以通过管道将其输出写入文件。这样我就可以将我所有的历史命令发送到一个文本文件中。 问题是我可以在每次
我在 about_Pipelines 阅读了有关 PowerShell 中的管道工作原理的信息,并了解到管道一次传送一个对象。 所以,这个 Get-Service | Format-Table -Pr
我正在尝试像这样从 powershell 启动一个进程:- $proc = (start-process $myExe -argumentList '/myArg True' -windowStyle
## To run the script # .\get_status.ps1 -Hostname -Service_Action -Service_Name #$Hostname = "hos
让我们使用 powershell 命令 Write-Host "red text"-Fore red这会在红色前景中显示“红色文本”。 但是,您希望文本以稍微亮一点的方式显示字体颜色,浅红色。 有没有
我是一名优秀的程序员,十分优秀!