2012-03-13 4 views
4

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

+2

Учитывая использование ** DiscUtils ** для текущего требования к проекту ... какие точные проблемы у вас были? – SliverNinja

ответ

5

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

Смежные вопросы