DVD ISO из C # - альтернативы .NET DiscUtils - PullRequest
6 голосов
/ 13 марта 2012

Каков наилучший способ создания .ISO файлов на основе структуры файловых папок из C #?Существует ли библиотека с открытым исходным кодом, отличная от DiscUtils ?Возникли проблемы с DiscUtils , и я хотел бы попробовать другой путь.Какие у меня варианты?Я бы предпочел открытый исходный код, но также мог бы заплатить за решение.

Ответы [ 3 ]

6 голосов
/ 27 марта 2012

Windows на самом деле поставляется с собственным API для создания ISO-файлов и многим другим: API Мастеринг изображений . Как только вы извлекаете сборку IMAPI2 Interop из Windows SDK или (возможно, проще) из этой статьи CodeProject об IMAPI2 , создание 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
}

Подробную информацию об единственном бите используемого клея Win32 / COM API можно найти на pinvoke.net: SHCreateStreamOnFile . IStream и STATSTG находятся в System.Runtime.InteropServices.ComTypes. .

5 голосов
/ 13 марта 2012

Вот еще несколько вариантов

2 голосов
/ 26 марта 2012

Вы можете попробовать Primo Burner: http://www.primoburner.com/Downloads.aspx

...