Hallo!
Ich möchte gerne in meiner Anwendung Files zippen bevor ich sie in eine Datenbank schreibe, damit sie dort nicht so viel Platz verbraten. Habe mir dazu die NetZipLib heruntergeladen und eingebaut. Hat auch soweit alles gut geklappt, aber die Zips werden nicht so wie sie sollten. Also die gezippten Files haben nicht ihre volle Länge sondern nur 200-400 Bytes.
Hier mein Code:
Man sieht, ich mache das Ganze doppelt, da ich das gezippte File zur Überprüfung auch auf meiner Platte haben wollte. Das Ergebnis ist aber in beiden Fällen das Gleiche. Das vollständige Lesen des MemoryStreams funktioniert. In readComplete steht am Ende die korrekte Anzahl von Bytes. Die Länge von msOut beträgt aber nur um die 200 - 400 Bytes.
Die Frage ist nun: was mache ich falsch ..?
Noch ein Hinweis: Ich benutze Framework 2. Das Projekt ist für Framework 2 geschrieben und ich kann das nicht ändern. Daher muß ich auch die Zip-Funktionalität von Aussen zuführen. Ich glaube ab 3.5 oder so gibts das auch schon in .NET integriert, oder?
viele Grüsse
Thomas.
Ich möchte gerne in meiner Anwendung Files zippen bevor ich sie in eine Datenbank schreibe, damit sie dort nicht so viel Platz verbraten. Habe mir dazu die NetZipLib heruntergeladen und eingebaut. Hat auch soweit alles gut geklappt, aber die Zips werden nicht so wie sie sollten. Also die gezippten Files haben nicht ihre volle Länge sondern nur 200-400 Bytes.
Hier mein Code:
Code:
private byte[] zipFile(byte[] pFileToZip)
{
MemoryStream msOut = new MemoryStream();
ZipOutputStream zos = new ZipOutputStream(msOut,false);
FileStream fops = new FileStream("c:\\temp\\testzip.zip", FileMode.Create);
ZipOutputStream zos2 = new ZipOutputStream(fops, false);
zos.PutNextEntry("file.xls");
MemoryStream msIn = new MemoryStream(pFileToZip);
byte[] buffer = new byte[30];
int bytesRead = 0;
int readComplete = 0;
do
{
bytesRead = msIn.Read(buffer, 0, buffer.Length);
zos.Write(buffer, 0, bytesRead);
readComplete += bytesRead;
}
while (bytesRead > 0);
zos.Flush();
zos.Close();
zos2.PutNextEntry("file.xls");
msIn.Seek(0,0);
do
{
bytesRead = msIn.Read(buffer, 0, buffer.Length);
zos2.Write(buffer, 0, bytesRead);
}
while (bytesRead > 0);
zos2.Flush();
zos2.Close();
System.Console.WriteLine("Anzahl Bytes: " + msOut.ToArray().Length);
System.Console.WriteLine("readComplete: " + readComplete);
return (msOut.ToArray());
}
}
Man sieht, ich mache das Ganze doppelt, da ich das gezippte File zur Überprüfung auch auf meiner Platte haben wollte. Das Ergebnis ist aber in beiden Fällen das Gleiche. Das vollständige Lesen des MemoryStreams funktioniert. In readComplete steht am Ende die korrekte Anzahl von Bytes. Die Länge von msOut beträgt aber nur um die 200 - 400 Bytes.
Die Frage ist nun: was mache ich falsch ..?
Noch ein Hinweis: Ich benutze Framework 2. Das Projekt ist für Framework 2 geschrieben und ich kann das nicht ändern. Daher muß ich auch die Zip-Funktionalität von Aussen zuführen. Ich glaube ab 3.5 oder so gibts das auch schon in .NET integriert, oder?
viele Grüsse
Thomas.