解压缩的邮政编码文件C#(从CD加载零件)



我正在尝试解压缩一个拆分为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;
    }
}

最新更新