ディスクユーティリティを使用して、ディレクトリから 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());
しかし、それは役に立ちませんでした。誰かがそれを解決するための最後の一押しをください。