根据 C# 的文件夹结构制作.ISO 文件的最佳方法是什么?除了DiscUtils之外,还有其他开源库吗?遇到 DiscUtils的问题,我想尝试另一条路径。我有哪些选择?我更喜欢开源,但也可能愿意为解决方案付费。
问问题
7765 次
3 回答
5
这里还有一些可以尝试
- C# [ISO] 映像创建器(不支持音频 CD)
- IsoCreator
于 2012-03-13T14:31:49.617 回答
5
Windows 实际上带有用于创建 ISO 的原生 API 等等:Image Mastering API。一旦您从 Windows SDK 或(可能更容易)从有关 IMAPI2 的 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
}
可以在 pinvoke.net 上找到唯一使用的 Win32/COM API 粘合的详细信息:SHCreateStreamOnFile。IStream 和 STATSTG 在System.Runtime.InteropServices.ComTypes 中。.
于 2012-03-26T20:44:10.600 回答
2
你可以试试 Primo Burner: http: //www.primoburner.com/Downloads.aspx
于 2012-03-26T10:24:25.877 回答