我正在尝试创建一个文件传输应用程序,在压缩后发送文件。我的主要目标是提供可恢复的传输,为此,我首先创建用户必须发送的所有文件的存档,然后我在流中打开存档并从中读取一大块数据(比如一块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");
问题出现在分块过程中的某个地方,因为如果我按原样发送存档,它可以工作,但是当我尝试制作块时,接收存档的大小更大,无法打开。
编辑:它已修复,我删除了之前创建的块,然后再创建它并修复了它
答案 0 :(得分:2)
问题是代码的第11行:
f.Write(buffer, 0, sourceBytes);
哪个应改为:
gzipout.Write(buffer, 0, sourceBytes);
我会说这会损坏您的原始存档,从文件的开头到结尾添加块(奇怪的是您没有看到错误,也许您是在读/写模式下打开它?)。并且没有对abc.zip进行任何更改:也许您在实验中留下了一个非空文件,导致接收端存档包含此文件的多个副本。