GZipStream et de décompression
J'ai un code qui devrait faire de la compression:
FileStream fs = new FileStream("g:\\gj.txt", FileMode.Open);
FileStream fd = new FileStream("g:\\gj.zip", FileMode.Create);
GZipStream csStream = new GZipStream(fd, CompressionMode.Compress);
byte[] compressedBuffer = new byte[500];
int offset = 0;
int nRead;
nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length);
while (nRead > 0)
{
csStream.Write(compressedBuffer, offset, nRead);
offset = offset + nRead;
nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length);
}
fd.Close();
fs.Close();
et je pense qu'il fait, mais je veux décompresser ce qui a été compressé à la manière ci-dessus. Je ne somethink comme ça:
FileStream fd = new FileStream("g:\\gj.new", FileMode.Create);
FileStream fs = new FileStream("g:\\gj.zip", FileMode.Open);
GZipStream csStream = new GZipStream(fs, CompressionMode.Decompress);
byte[] decompressedBuffer = new byte[500];
int offset = 0;
int nRead;
nRead=csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length);
while (nRead > 0)
{
fd.Write(decompressedBuffer, offset, nRead);
offset = offset + nRead;
nRead = csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length);
}
fd.Close();
fs.Close();
et ici il ne fait pas... j'ai nRead = 0 befeore entrer dans la boucle... Ce que je fais de mal??
Le fichier de test que j'utilise est le principe le plus simple fichier TEXTE (taille: 104 octets)...
Édité réponse à montrer à la fois lire et écrire
Notez également que gzip != ".zip"
(remarque, j'ai corrigé un bug après validation; cheack que les deux
Notez également que gzip != ".zip"
(remarque, j'ai corrigé un bug après validation; cheack que les deux
while
les boucles que Read
sur la ligne du haut (pas à la base).OriginalL'auteur | 2009-10-17
Vous devez vous connecter pour publier un commentaire.
Ma première pensée est que vous n'avez pas fermé
csStream
. Si vous utilisezusing
cela se fait automatiquement. Depuis gzip tampons de données, vous pourriez être absent quelques.Deuxièmement, ne pas incrémenter
offset
; c'est le décalage dans le tampon (pas le flux de données). Laissez à 0:Il fonctionne!!! Merci!
Au lieu de la mémoire tampon en boucle vous pouvez également utiliser le construit en .CopyTo() fonction. Dans ce cas, il serait: csStream.CopyTo(fd);
pas quand cette réponse a été écrit, je ne le pouvais pas ;p
Bon point, juste en ajoutant à ce peu de connaissances. Un autre problème, je l'ai trouvé avec GZipStream. Si vous écrivez à un MemoryStream vous devez .Close() le GZipStream. Sinon, il va se tenir à la dernière quelques octets. .Flush() ne semble pas faire le travail. (C'est si vous utilisez le MemoryStream à l'intérieur de l'instruction à l'aide.)
OriginalL'auteur Marc Gravell
Code ci-dessous montre la compression et la décompression à l'aide de GZipStream:
OriginalL'auteur Bilal
Les deux méthodes que j'ai sont comme James Roland mentionné.
Cependant, je suis en utilisant un téléchargement avec
puis de compresser et de les enregistrer dans la base de données. Puis-je tirer la img, de décompresser et de définir un crs, avec
IDisposable
objet sansusing
!Bien évidemment préféré prendre avantage de
using
lorsque cela est possible, en disant: "jamais" n'est tout simplement pas exacte, et il y a beaucoup de cas où il n'est pas nécessaire et/ou possible.OriginalL'auteur Stephen Himes