我正在开发一个项目,需要打开现有的 ISO 文件,向其中添加特定文件(例如 XML 文件),然后保存更新的 ISO 映像。我一直在使用 DiscUtils 库来读取和写入 ISO 文件,但在尝试修改 ISO 内容时遇到问题。
这就是我想做的:
选择现有的 ISO 文件。 从 URL 下载 XML 文件(我已经有一个方法)。 将下载的 XML 文件添加到 ISO 中。 将更新的 ISO 保存到新文件。 我想在添加新文件时保持 ISO 的现有内容不变。
我尝试过的:
我使用 DiscUtils 库打开现有 ISO 文件,将新的 XML 文件添加到 ISO,然后将更新的 ISO 保存到新文件。以下是我使用的代码:
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using DiscUtils.Iso9660;
public async Task UpdateIsoWithXmlAsync(string isoFilePath, string xmlFilePath, string outputIsoPath)
{
using (FileStream isoStream = File.OpenRead(isoFilePath))
using (FileStream outputIsoStream = File.Create(outputIsoPath))
{
CDBuilder builder = new CDBuilder();
builder.UseJoliet = true;
builder.UseRockRidge = true;
// Read the existing ISO content
using (CDReader cdReader = new CDReader(isoStream, true))
{
foreach (string filePath in cdReader.GetFiles("/"))
{
string relativePath = filePath.TrimStart('/');
using (Stream fileStream = cdReader.OpenFile(filePath, FileMode.Open, FileAccess.Read))
{
builder.AddFile(relativePath, fileStream);
}
}
}
// Add the new XML file
builder.AddFile("file.xml", xmlFilePath);
// Build the updated ISO
builder.Build(outputIsoStream);
}
}
我的期望:
我希望更新的 ISO 包含所选 ISO 中的所有原始文件,以及添加的 XML 文件。新 ISO 的大小应接近原始大小,并在适当的位置添加新的 XML 文件。
实际发生了什么:
生成的 ISO 比预期小得多(大约 3.81 MB),并且原始内容似乎没有正确复制。似乎没有修改原始 ISO,而是创建了一个仅包含 XML 文件的新 ISO。此外,ISO 的大小也显着减小。
考虑使用以下方法:
public static void UpdateIsoWithXmlAsync(string isoFilePath, string outputIsoPath, string sourceXml)
{
using (var inIso = File.OpenRead(isoFilePath))
using (var outIso = File.Create(outputIsoPath))
{
var builder = new CDBuilder
{
UseJoliet = true
};
// Read the existing ISO content
using (var cdReader = new CDReader(inIso, true))
{
foreach (string filePath in cdReader.GetFiles(path: "\\", searchPattern: "*.*", searchOption: SearchOption.AllDirectories))
{
using (var stream = cdReader.OpenFile(filePath, FileMode.Open, FileAccess.Read))
{
builder.AddFile(filePath, stream);
}
}
}
// Add the new XML file
builder.AddFile("file.xml", sourceXml);
// Build the updated ISO
builder.Build(outIso);
}
}
调用该方法的示例:
UpdateIsoWithXmlAsync(@"D:\path\test.iso", @"D:\path\modified.iso", @"D:\path\doc.xml");
测试应用程序是使用以下软件包配置的(
packages.config
):
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="DiscUtils.Core" version="0.16.13" targetFramework="net48" />
<package id="DiscUtils.Iso9660" version="0.16.13" targetFramework="net48" />
<package id="DiscUtils.Streams" version="0.16.13" targetFramework="net48" />
</packages>