Во-первых, некоторые разъяснения терминов. По финализировать я не подразумеваю закрытие сеанса; Я имею в виду написать вывод на CD или DVD таким образом, что информация больше не может быть добавлена к нему обычными средствами (Roxio, Nero, Windows Explorer и т.д.).
Я провел много исследований по этому вопросу. Есть некоторые программы с открытым исходным кодом, такие как InfraRecorder, из которых мы могли бы нарисовать некоторое вдохновение, но все они, похоже, содержат довольно сложные строки С++ код с использованием IMAPI, который выглядит как очень низкоуровневый способ делать что-то. Никто из нас не обладает опытом С++ или IMAPI для поддержки такой базы кода.
Самый многообещающий ресурс в Интернете выглядит этот, но, похоже, он не включает функцию финализации. Вот код, который "пишет изображение":
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
};
Но это не функция финализации; это функция, которая записывает фактические данные на диск. Вам нужно создать новый сеанс для завершения финализации на существующем диске?