1

C# で Live File System (または「Live UDF」) 光ディスクをファイナライズしようとしています。MSDN および TechNet の記事とさまざまなフォーラムへの投稿を読んで理解したところによると、Image Mastering API (または IMAPI) はこのタイプのファイルシステムをサポートしていません。また、コーディング作業で IMAPI を使用して LiveUDF ディスクをファイナライズすることに失敗しました。その結果、FSCTL_MAKE_MEDIA_COMPATIBLE 制御コードを使用して DeviceIoControl 関数を使用しています。

まず、DeviceIoControl を同期的に呼び出していましたが、関数は 1117 を返し、ディスクは最終的に数分後にファイナライズされました。最終的な失敗または実際の成功の場合にのみプロセスを返す必要があるため、この結果は受け入れられません。

次に、CreateFile で FILE_FLAG_OVERLAPPED (0x40000000) dwFlagsAndAttributes フラグを指定してデバイス ハンドルを開き、NativeOverlapped オブジェクトを DeviceIoControl 呼び出しに渡すことで、DeviceIoControl を非同期的に呼び出します。その前に、明らかに、オーバーラップ イベントを処理するために IOCompletionCallback を設定しました。

説明したように DeviceIoControl を非同期で呼び出すと、(同期的に呼び出された場合と同様に) ほとんどすぐに 1117 が返され、IOCompletionCallback メソッドは呼び出されず、ディスクは数分後にファイナライズされます。

私の質問は: C# と DeviceIoControl を使用して Windows 7 プラットフォーム上の C# で Live File System (または「Live UDF」) 光ディスクをファイナライズするにはどうすればよいですか (プロセスが完了するまで「待機」する機能を使用して、同期的または非同期的に)最終的な成功または失敗の結果をキャプチャするため)?

よろしくお願いします。

4

2 に答える 2

1

IOCTL_SCSI_PASS_THROUGH_DIRECT制御コードと、 Close Track/Session SCSI MultiMedia Command (MMC)で定義されたSCSI_PASS_THROUGH_DIRECT構造体を渡してDeviceIoControlを呼び出すと、Live UDF ディスクをファイナライズし、最終的な成功または失敗時にDeviceIoControl関数を返す方法が提供されました。

私はINCITS T10 技術委員会の SCSI マルチメディア コマンドの提案とhttp://sourceforge.net/projects/bwgburn/のプロジェクトを読みながら、これをつなぎ合わせました。

基本的に、デバイスに SCSI コマンドを送信するだけになりました (これは委員会の提案で定義されています)。

于 2012-09-07T20:09:38.420 に答える
0

最近同じ問題に遭遇し、IMAPI2.MsftDiscFormat2Data の .ForceMediaToBeClosed を使用して、書き込みの完了後に CD をファイナライズできることがわかりました。これは私のコードです(powershellで):

$TargetFolder="c:\path\to\files\to\be\burned"
$DiskMaster = New-Object -com IMAPI2.MsftDiscMaster2
$DiscRecorder = New-Object -com IMAPI2.MsftDiscRecorder2
$id = $DiskMaster.Item(0) #specify drive index here
$DiscRecorder.InitializeDiscRecorder($id)               
$FileSystemImage = New-Object -com IMAPI2FS.MsftFileSystemImage
$dir = $FileSystemImage.Root
$DiscFormatData  = New-Object -com IMAPI2.MsftDiscFormat2Data
$DiscFormatData.Recorder = $DiscRecorder
$DiscFormatData.ClientName = 'cd label' #specify cd label here
$DiscFormatData.ForceMediaToBeClosed = $true   #to finalize cd after burn
$FileSystemImage.ChooseImageDefaults($DiscRecorder)                
$dir.AddTree($TargetFolder, $false)
$result = $FileSystemImage.CreateResultImage()
$stream = $result.ImageStream
$DiscFormatData.Write($stream)
于 2014-01-21T16:02:06.150 に答える