如何使用 C# 将文件添加到现有 ISO 映像并保存更新的 ISO?

问题描述 投票:0回答:1

我正在开发一个项目,需要打开现有的 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 的大小也显着减小。

c# xml iso
1个回答
0
投票

考虑使用以下方法:

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>
© www.soinside.com 2019 - 2024. All rights reserved.