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

C# 创建较小的文件块,然后将其压缩并解压缩回一个文件,c#,gzip,C#,Gzip,我正在尝试创建一个文件传输应用程序,它在压缩文件后发送文件。我的主要目标是提供可恢复的传输,为此,我首先创建用户必须发送的所有文件的存档,然后在流中打开存档并从中读取数据块(比如2mb块),我压缩该数据块并在接收端将其解压缩,然后将该数据附加到一个更大的文件中,该文件将成为主归档文件 GZipOutputStream gzipout = new GZipOutputStream(File.Create("abc.zip")); //reading and comp

我正在尝试创建一个文件传输应用程序,它在压缩文件后发送文件。我的主要目标是提供可恢复的传输,为此,我首先创建用户必须发送的所有文件的存档,然后在流中打开存档并从中读取数据块(比如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");
GZipOutputStream gzipout=newgzipoutputstream(File.Create(“abc.zip”);
//读取块并将其压缩为abc.zip
做
{
//f是原始存档的文件流
sourceBytes=f.Read(buffer,0,buffer.Length);
if(sourceBytes==0)
{
打破
}
写入(缓冲区,0,源字节);
bytesread+=源字节;
}while(bytesread
问题出在分块过程中的某个地方,因为如果我按原样发送归档文件,它会工作,但当我尝试制作分块时,接收归档文件的大小较大,无法打开


编辑:修复了,我在创建新块之前删除了先前创建的块,并修复了它

问题是代码的第11行:

f.Write(buffer, 0, sourceBytes);
应更改为:

gzipout.Write(buffer, 0, sourceBytes);

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

在哪一行引发了什么异常?没有引发异常,只是在接收端创建了存档(解压并附加所有区块后)具有不同的文件大小(约100kb以上),无法由zip管理器打开(存档意外结束,原始存档打开)压缩一个已经压缩的流几乎总是会产生增长的副作用。如果它已经压缩了,请发送压缩后的数据块,不要再压缩数据块。它只是一个存档(一个没有压缩的压缩文件)问题只发生在我制作块时,如果我再次将其压缩到一个大文件中,然后解压缩,大小保持不变,zip管理员打开它时不会给出任何错误。使用十六进制编辑器查看文件。或者使用一个字节的小块使问题更加明显。不,抱歉,这是一个打字错误,我正在尝试其他一些事情我在这里发布了,它最初是gzipout.Write(),我找到了解决方案,它与filemode.create有关,它可能没有正确地覆盖以前创建的块(因为在使用块后添加file.delete修复了它)