创建一个较小的文件块,然后压缩并解压缩回一个文件

时间:2013-11-05 10:45:19

标签: c# gzip

我正在尝试创建一个文件传输应用程序,在压缩后发送文件。我的主要目标是提供可恢复的传输,为此,我首先创建用户必须发送的所有文件的存档,然后我在流中打开存档并从中读取一大块数据(比如一块2mb),我压缩该块并在接收端解压缩,然后将该数据附加到一个更大的文件中,该文件将成为主存档。

GZipOutputStream gzipout = new GZipOutputStream(File.Create("abc.zip"));
                //reading and compressing the chunk into abc.zip
                do
                {
                    //f is my filestream for the original archive
                    sourceBytes = f.Read(buffer, 0, buffer.Length);
                    if (sourceBytes == 0)
                    {
                        break;
                    }
                    gzipout.Write(buffer, 0, sourceBytes);
                    bytesread += sourceBytes;
                } while (bytesread < chunklength);
            bytesread = 0;



            gzipout.Finish();
            gzipout.Close();
            //encrypting the chunk
            s.EncryptFile("abc.zip","abc.enc");

            //the chunk is sent over here to the receiving side
            //these are the functions on the receiving side
            //decrypting the chunk
            s.DecryptFile("abc.enc","abc1.zip");

            GZipInputStream gzipin=new GZipInputStream(File.OpenRead("abc1.zip"));
            //the chunk is being decompressed and appended into the original archive file
            FileStream temp = File.Open(Path.GetFileName("originalzip.zip"), FileMode.Append);

            int size = 2048;
            byte[] data = new byte[2048];
            while (true)
            {
                size = gzipin.Read(data, 0, data.Length);
                if (size != 0)
                    temp.Write(data, 0, size);
                else
                    break;
            }
            temp.Flush();
            temp.Close();
        } while (sourceBytes!=0);
        ExtractAll("originalzip.zip", "testest");

问题出现在分块过程中的某个地方,因为如果我按原样发送存档,它可以工作,但是当我尝试制作块时,接收存档的大小更大,无法打开。

编辑:它已修复,我删除了之前创建的块,然后再创建它并修复了它

1 个答案:

答案 0 :(得分:2)

问题是代码的第11行:

f.Write(buffer, 0, sourceBytes);

哪个应改为:

gzipout.Write(buffer, 0, sourceBytes);

我会说这会损坏您的原始存档,从文件的开头到结尾添加块(奇怪的是您没有看到错误,也许您是在读/写模式下打开它?)。并且没有对abc.zip进行任何更改:也许您在实验中留下了一个非空文件,导致接收端存档包含此文件的多个副本。