3

ディスクユーティリティを使用して、ディレクトリから iso ファイルを作成しようとしています。このコードはいくつかのファイルで正常に動作しますが、しばらくすると、「isoBuilder.AddFile(fileOnIso,br.BaseStream);」で「同じキーを持つオブジェクトが既に存在する」という例外がスローされます。なぜこれが起こるのか理解できません。誰かが光を当てることができますか?

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);
        }

    }

更新 ストリームを回避する別の可能な実装、欠点は、3GB iso で時間がかかりすぎる (30 分以上) ことです。たとえば、ultraiso でビルドすると、約 4 分かかります。何かアイデアはありますか?

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 のビルドのテスト

index.html ブート ブート\isolinux ブート\isolinux\boot.cat ブート\isolinux\boot.msg ブート\isolinux\f2 ブート\isolinux\f3 ブート\isolinux\german.kbd ブート\isolinux\isolinux.bin ブート\isolinux\isolinux .cfg boot\isolinux\linux24 boot\isolinux\logo.16 boot\isolinux\minirt24.gz KNOPPIX KNOPPIX\KNOPPIX KNOPPIX\KNOPPIX の問題

更新 2

最後にいくつかの進歩..エラーは指定されたパスのいずれにもありませんが、ファイルストリームがisoに完全に追加されるまで、isobuilder.Addfile()を呼び出し続ける必要があると思います。

私はただ動かなければなりませんでした:

isoBuilder.AddFile(fileOnIso,br.BaseStream);

foreach 閉じ括弧の前。これにより、ISO に何度も追加する必要がなくなります。

最後の 1 つの問題は、行にあります。

 isoBuilder.Build(isoFile);

ファイルが閉じられていると不平を言う場所。私はそれを修正しようとしました:

FileInfo fi = new FileInfo(isoFile);
isoBuilder.Build(fi.OpenWrite());

しかし、それは役に立ちませんでした。誰かがそれを解決するための最後の一押しをください。

4

1 に答える 1