来自C#的DVD ISO - .NET DiscUtils替代品

时间:2012-03-13 14:21:13

标签: c# .net dvd iso9660

根据C#的文件夹结构制作 .ISO文件的最佳方法是什么?是否有DiscUtils以外的开源库?遇到 DiscUtils 的问题,我想尝试另一条路径。我有什么选择?我更喜欢开源,但也可能愿意支付解决方案。

3 个答案:

答案 0 :(得分:6)

Windows实际上附带了用于创建ISO的本机API以及更多内容:Image Mastering API。从Windows SDK中获取IMAPI2 Interop程序集或从this CodeProject article about IMAPI2(可能更容易)获取IMAPI2 Interop程序集后,创建ISO只需几行代码。

不幸的是,您还需要一些段落来正确清理所涉及的COM废话,但最终结果仍然是可管理的:

MsftFileSystemImage iso = new MsftFileSystemImage();
iso.ChooseImageDefaultsForMediaType(IMAPI_MEDIA_PHYSICAL_TYPE.IMAPI_MEDIA_TYPE_DISK);
iso.FileSystemsToCreate = FsiFileSystems.FsiFileSystemISO9660 | FsiFileSystems.FsiFileSystemJoliet;

iso.Root.AddTree(@"c:\path\goes\here\", false);

dynamic resultImage = iso.CreateResultImage();
dynamic imageStream = resultImage.ImageStream;
IStream newStream = null;

if (imageStream != null)
{
    STATSTG stat = null;
    imageStream.Stat(stat, 0x1);

    int res = SHCreateStreamOnFile(@"c:\path\to\your.iso", 0x1001, newStream);
    if (res == 0 && newStream != null)
    {
        IntPtr inBytes = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(long)));
        IntPtr outBytes = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(long)));
        try
        {
            imageStream.CopyTo(newStream, stat.cbSize, inBytes, outBytes);
        }
        finally
        {
            Marshal.FinalReleaseComObject(imageStream);
            newStream.Commit(0);
            Marshal.FinalReleaseComObject(newStream);
            Marshal.FreeHGlobal(inBytes);
            Marshal.FreeHGlobal(outBytes);
            Marshal.FinalReleaseComObject(resultImage);
            Marshal.FinalReleaseComObject(iso);
        }
    }
    else
    {
        Marshal.FinalReleaseComObject(imageStream);
        Marshal.FinalReleaseComObject(resultImage);
        Marshal.FinalReleaseComObject(iso);
        //TODO: Throw exception or do whatever to signal failure here
    }
}    
else
{
    Marshal.FinalReleaseComObject(resultImage);
    Marshal.FinalReleaseComObject(iso);
    //TODO: Throw exception or do whatever to signal failure here
}

可以在pinvoke.net上找到有关Win32 / COM API粘合剂的详细信息:SHCreateStreamOnFile。 IStream和STATSTG位于System.Runtime.InteropServices.ComTypes.

答案 1 :(得分:5)

还有一些尝试

答案 2 :(得分:2)

您可以尝试使用Primo Burner:http://www.primoburner.com/Downloads.aspx