首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DiscUtils从目录生成iso文件

使用DiscUtils从目录生成iso文件
EN

Stack Overflow用户
提问于 2013-07-19 06:53:02
回答 1查看 2K关注 0票数 3

我正在尝试从一个目录构建一个包含磁盘的iso文件。这段代码可以处理几个文件,但过了一段时间,我抛出一个异常,在"isoBuilder.AddFile(fileOnIso,br.BaseStream);“处声明”具有相同键的对象已经存在“。我不明白为什么会有这样的事情发生,有人能给我一点启示吗?

代码语言:javascript
复制
public void AddtoISO(string directory,string isoFile)
    {
        BinaryReader br;
        long bytesRemain = 0;
        long totalBytesWritten = 0;
        DirectoryInfo rootDirToAdd = new DirectoryInfo(sourceName);
        DirectoryInfo currentDirToAdd = new DirectoryInfo(directory);

        try
        {
            foreach (FileInfo file in currentDirToAdd.GetFiles())
            {

                string fileFullPath = file.FullName;
                string fileOnIso = fileFullPath.Substring(fileFullPath.IndexOf(rootDirToAdd.Name) + rootDirToAdd.Name.Length + 1);

                Console.WriteLine(fileOnIso);

                br = new BinaryReader(file.OpenRead());

                while(totalBytesWritten < file.Length)
                {                       
                    bytesRemain = file.Length - totalBytesWritten;

                    br.ReadBytes(blockSize);
                    isoBuilder.AddFile(fileOnIso,br.BaseStream);

                    if(bytesRemain<blockSize)
                    {
                        totalBytesWritten += bytesRemain;
                        totalBytesAdded += bytesRemain;
                    }
                    else
                    {
                        totalBytesWritten += blockSize;
                        totalBytesAdded += blockSize;
                    }

                }

                itemsAdded++;
                totalBytesWritten = 0;

            }
            foreach (DirectoryInfo subdir in currentDirToAdd.GetDirectories())
            {
                string folderFullPath = subdir.FullName;
                string folderOnIso = folderFullPath.Substring(folderFullPath.IndexOf(rootDirToAdd.Name) + rootDirToAdd.Name.Length + 1);

                isoBuilder.AddDirectory(folderOnIso);
                itemsAdded++;

                AddtoISO(subdir.FullName,isoFile,ctoken);
            }

            isoBuilder.Build(isoFile);

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }

    }

Update是避免流的另一种可能的实现,它的缺点是在3GB的iso上花费了太多的时间(超过30分钟),例如,使用ultraiso构建时,它需要4分钟的时间。有什么想法吗?

代码语言:javascript
复制
public void AddtoISO(string directory,string isoFile)
    {

        try
        {
            DirectoryInfo rootDirToAdd = new DirectoryInfo(sourceName);
            DirectoryInfo currentDirToAdd = new DirectoryInfo(directory);

            foreach (FileInfo file in currentDirToAdd.GetFiles())
            {
                string fileOnHdd = file.FullName;
                string fileOnIso = fileOnHdd.Substring(fileOnHdd.IndexOf(rootDirToAdd.Name) + rootDirToAdd.Name.Length + 1);
                Console.WriteLine(fileOnIso);
                isoBuilder.AddFile(fileOnIso,fileOnHdd);
                itemsAdded++;
            }
            foreach (DirectoryInfo subdir in currentDirToAdd.GetDirectories())
            {
                itemsAdded++;
                AddtoISO(subdir.FullName,isoFile,ctoken);
            }

            isoBuilder.Build(isoFile);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }

    }

更新:

如果目录结构为以下内容,则引发异常:

开机启动

它似乎创建了引导目录的键,当它遇到boot.ext文件时,它错误地认为它是一个双重加法。换句话说,当文件包含其包含目录的名称时。

测试大楼dsl-4.11.rc1.iso

KNOPPIX\KNOPPIX \ KNOPPIX上的index.html boot\isolinux\boot.cat \ boot \minirt24.gz KNOPPIX\KNOPPIX问题

更新2

最后取得了一些进展..。错误不在任何给定路径中,但我假设必须一直调用isobuilder.Addfile(),直到filestream完全添加到iso中为止。

我只需要搬家:

代码语言:javascript
复制
isoBuilder.AddFile(fileOnIso,br.BaseStream);

在前刀关闭托架之前。这样,就不必在iso中一次又一次地添加它。

最后一个问题是在线上。

代码语言:javascript
复制
 isoBuilder.Build(isoFile);

它抱怨文件被关闭的地方。我试着用以下方法来纠正它:

代码语言:javascript
复制
FileInfo fi = new FileInfo(isoFile);
isoBuilder.Build(fi.OpenWrite());

但没什么用。请有人给我最后的推动力来解决它。

EN

回答 1

Stack Overflow用户

发布于 2020-11-23 23:34:12

我知道这是非常古老的,但我认为Id张贴,如果其他人需要帮助,在这方面在未来。

下面是一个快速而有效的函数,我使用DiscUtils.Iso9660构建一个标准化组织。

代码语言:javascript
复制
public string CreateIsoImage(string sourceDrive, string targetIso, string volumeName)
{
    try
    {
        var srcFiles = Directory.GetFiles(sourceDrive, "*", SearchOption.AllDirectories);
        var iso = new CDBuilder
        {
            UseJoliet = true,
            VolumeIdentifier = volumeName
        };

        foreach (var file in srcFiles)
        {
            var fi = new FileInfo(file);
            if (fi.Directory.Name == sourceDrive)
            {
                iso.AddFile($"{fi.Name}", fi.FullName);
                continue;
            }
            var srcDir = fi.Directory.FullName.Replace(sourceDrive, "").TrimEnd('\\');
            iso.AddDirectory(srcDir);
            iso.AddFile($"{srcDir}\\{fi.Name}", fi.FullName);
        }

        iso.Build(targetIso);
        return "Success";
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}

用法:

代码语言:javascript
复制
var res = CreateIsoImage("D:\\", "C:\\Temp\\MyIsoImage.iso", "MyVolumeName");
MessageBox.Show(res);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17739800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档