我正在尝试从一个目录构建一个包含磁盘的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);
}
}Update是避免流的另一种可能的实现,它的缺点是在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
KNOPPIX\KNOPPIX \ KNOPPIX上的index.html boot\isolinux\boot.cat \ boot \minirt24.gz KNOPPIX\KNOPPIX问题
更新2
最后取得了一些进展..。错误不在任何给定路径中,但我假设必须一直调用isobuilder.Addfile(),直到filestream完全添加到iso中为止。
我只需要搬家:
isoBuilder.AddFile(fileOnIso,br.BaseStream);在前刀关闭托架之前。这样,就不必在iso中一次又一次地添加它。
最后一个问题是在线上。
isoBuilder.Build(isoFile);它抱怨文件被关闭的地方。我试着用以下方法来纠正它:
FileInfo fi = new FileInfo(isoFile);
isoBuilder.Build(fi.OpenWrite());但没什么用。请有人给我最后的推动力来解决它。
发布于 2020-11-23 23:34:12
我知道这是非常古老的,但我认为Id张贴,如果其他人需要帮助,在这方面在未来。
下面是一个快速而有效的函数,我使用DiscUtils.Iso9660构建一个标准化组织。
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;
}
}用法:
var res = CreateIsoImage("D:\\", "C:\\Temp\\MyIsoImage.iso", "MyVolumeName");
MessageBox.Show(res);https://stackoverflow.com/questions/17739800
复制相似问题