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