none
Error al leer archivos empaquetados y comprimidos con Gzip RRS feed

  • Pregunta

  • Hola, estoy creando una aplicación para empaquetar varios archivos en uno y comprimir los(uso gzip), pero al leer el archivo empaquetado salta este error:

    "Se produjo una excepción de tipo 'System.InvalidOperationException' en System.dll pero no se controló en el código del usuario

    Información adicional: No se permite leer la secuencia de compresión."

    El código que uso es este:

      void PackFiles(string path)
            {
                List<string> files = new List<string>();
                Invoke((MethodInvoker)delegate {
                    foreach (string i in listBox1.Items) files.Add(i);
                });
    
                //Creates the file
                FileStream fstream = new FileStream(path, FileMode.Create);
                GZipStream gzstream = new GZipStream(fstream, CompressionLevel.Optimal);
                
    
                //Creates the pack preheader
                char[] preHeaderChar = { 'P', 'A', 'C', 'K' };
                byte[] preHeader = Encoding.UTF8.GetBytes(preHeaderChar);
                byte[] count = BitConverter.GetBytes((Int32)files.Count);
    
                //Writes the preheader
                gzstream.Write(preHeader, 0, 4);
                gzstream.Write(count, 0, 4);
    
                foreach (string filename in files)
                {
                    Invoke((MethodInvoker)delegate { label_progress.Text = "Packing: " + filename; });
                    //Checks the file exists and gets it's info
                    if (!File.Exists(filename)) throw new PackException("File: " + filename + " not found");
                    FileInfo fi = new FileInfo(filename);
    
                    //Reads the file             
                    byte[] data = File.ReadAllBytes(filename);
    
                    //Creates the header
                    byte[] sizeheader = BitConverter.GetBytes((Int32)data.Length);
                    byte[] nameheader = StringToByteArray(fi.Name, 64);
    
                    //Writes the header  to the pack
                    gzstream.Write(sizeheader, 0, sizeheader.Length);
                    gzstream.Write(nameheader, 0, nameheader.Length);
                    sizeheader = null;
                    nameheader = null;
                    fi = null;
    
                    //Writes the file to the pack
                    gzstream.Write(data, 0, data.Length);
                    data = null;             
                }
                Invoke((MethodInvoker)delegate { label_progress.Text = "Done"; });
                Invoke((MethodInvoker)delegate { UnlockUI(); });
                gzstream.Close();
                fstream.Close();
            }
    
    
     void UnpackFiles(string path, string folder)
            {
                if (!File.Exists(path)) throw new UnPackException("File: " + path + " not found");
                
                //Initialize variables        
                Int32 count2 = 0;
                byte[] preHeader = new byte[4];
                byte[] filescount = new byte[4];
    
    
                //Open the file
                FileStream fstream = new FileStream(path, FileMode.Open);
                GZipStream gzstream = new GZipStream(fstream, CompressionLevel.Optimal);
    
    
                //Read the preHeaders
                //Aquí salta el error
                gzstream.Read(preHeader, 0, 4);
    
                //Checks if the file is a pack
                if (Encoding.Default.GetString(preHeader) == "PACK")
                    gzstream.Read(filescount, 0, 4);
                //Throws a exception
                else { throw new UnPackException("File: " + path + " is not a pack file"); }
                count2 = BitConverter.ToInt32(filescount, 0);
    
                //Frees the preHeaders
                preHeader = null;
                filescount = null;
    
    
                //Starts reading the file headers
                for (int i = 0; i <= count2 - 1; i++)
                {               
                    string filename = "";
                    Int32 fileSize = 0;
                    byte[] fileSizeHeader = new byte[4];
    
                    //Reads the header
                    gzstream.Read(fileSizeHeader, 0, 4);              
    
                    //Gets the file size in bytes and nulls the header data
                    fileSize = BitConverter.ToInt32(fileSizeHeader, 0);
                    fileSizeHeader = null;
    
                    //Reads the filename header
                    byte[] header = new byte[64];
                    gzstream.Read(header, 0, 64);
                    filename = Encoding.Default.GetString(header);
                    header = null;              
    
                    //Reads the file
                    byte[] data = new byte[fileSize];
                    gzstream.Read(data, 0, fileSize);            
    
                    filename = filename.Replace("\0", string.Empty);
                    File.WriteAllBytes(folder + "\\" + filename, data);
    
                    Invoke((MethodInvoker)delegate { label_progress.Text = "UnPacked: " + filename; });            
    
                    data = null;
    
                }
                Invoke((MethodInvoker)delegate { label_progress.Text = "Done"; });
                Invoke((MethodInvoker)delegate { UnlockUI(); });
                gzstream.Close();
                fstream.Close();
               
            }

    Ademas de esto, si no uso compresión al desempaquetar los archivos quedan con caracteres delante.

    lunes, 27 de octubre de 2014 16:49

Respuestas

  • Ya lo he solucionado, el problema esta en que el gzipstream debe inicizlizarse como decompresion, sin poner el nivel. El otro problema es por que usaba distinitos encodings.
    • Propuesto como respuesta Deric Ferreira lunes, 27 de octubre de 2014 18:22
    • Marcado como respuesta webJoseModerator lunes, 27 de octubre de 2014 19:34
    lunes, 27 de octubre de 2014 18:13

Todas las respuestas