我正在尝试解压缩一个拆分为5个部分的zip文件。问题是每个部分都在不同的CD中,我需要能够在解压缩时更换磁盘。我已经使用ionic.zip在没有运气的情况下做到了!
foreach (var entry in zip.Entries)
{
var stream = entry.OpenReader();
var buffer = new byte[readByte];
int n;
try
{
while ((n = stream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, buffer.Length);
}
}
catch (FileNotFoundException ex)
{
// stream is closed and you cant continue
MessageBox.Show("Change CD");
while ((n = stream.Read(buffer,0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, buffer.Length);
}
}
}
我尝试了SevenZip,Zipsharp,但我无法实施它!有什么方法可以处理这种情况?
要打开一个分裂的ziparchive,不需要额外的库,但是需要完成一些额外的工作
List<string> files = new List<string> { "zip.001",
"zip.002",
"zip.003",
"zip.004",
};
using (var zipFile = new ZipArchive(new CombinationStream(files.Select(x => new FileStream(x, FileMode.Open) as Stream).ToList()), ZipArchiveMode.Read))
{
// Do whatever you want
}
在此示例中,我使用CombinationsTream打开所有Zipfiles,但是您可以轻松地为您的需求写下自己的类,以等待所有CD读取。
可能是(只是伪代码):
public class MultiDeviceStream : Stream
{
[...]
private Queue<Stream> streams;
private Stream activeStream;
public byte ReadByte() {
byte result;
if (!activeStream.EndOfStream) {
result = activeStream.ReadByte();
if (!streams.CanDequeue && activeStream.EndOfStream) {
// raise some event signaling to change the CD and wait for the new filestream here
this.EndOfStream = true;
}
} else {
if (streams.CanDequeue) {
activeStream = streams.Dequeue();
}
else
{
throw EndOfStreamException();
}
return ReadByte();
}
return result;
}
}