public static void agregarNuevaCompresion(InfCompresion nuevo)
        {
            string path = nuevo.RutaO;

            using (StreamWriter sw = File.AppendText(path))
            {
                //string text =
                //    $"Nombre Original: {nuevo.nombreOriginal}, Razon de Compresion: {nuevo.razonDeCompresion}, Factor de Compresion: {nuevo.factorDeCompresion}, Porcentaje de Compresion: {nuevo.porcentajeDeCompresion}";
                //sw.WriteLine(text);

                string text =
                    $" {nuevo.nombreOriginal},  {nuevo.razonDeCompresion},   {nuevo.factorDeCompresion},  {nuevo.porcentajeDeCompresion},{nuevo.RutaO}";
                if (!text.Equals(""))
                {
                    sw.WriteLine(text);
                }
            }
        }
Exemplo n.º 2
0
        public void Comprimir(string dirLectura, string dirEscritura, string dirEscritura2)
        {
            #region Variables

            int LongitudMaxDiccionario = 256;
            int LongitudByte           = 8;

            #endregion

            #region Caracteres

            var diccionario = obtenerDiccionarioCompresion();
            LongitudMaxDiccionario = diccionario.Count;

            #endregion
            //Analizar texto, creando diccionario y escribiendo en archivo
            #region Algoritmo

            int LongitudBuffer = 1024;

            //Empezar concatenar
            string     c         = string.Empty;
            List <int> comprimir = new List <int>();

            string bits     = "";
            int    contador = 0;

            //Buffer para comprimir
            using (var file = new FileStream(dirLectura, FileMode.Open))
            {
                using (var reader = new BinaryReader(file))
                {
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        var buffer = reader.ReadBytes(count: LongitudBuffer);

                        foreach (var t in buffer)
                        {
                            string ct = c + ((char)t);
                            if (diccionario.ContainsKey(ct))
                            {
                                c = ct;
                            }
                            else
                            {
                                //sacarlo
                                string ByteString = Convert.ToString(diccionario[c], 2).PadLeft(LongitudByte, '0'); // produce cadena "00111111";
                                bits += ByteString;

                                while (bits.Length >= 8) //Escribir bytes en archivo
                                {
                                    string Byte = bits.Substring(0, 8);
                                    bits = bits.Remove(0, 8);

                                    ByteArrayToFile(dirEscritura, new[] { Convert.ToByte(Convert.ToInt32(Byte, 2)) });
                                }

                                comprimir.Add(diccionario[c]);
                                //Aqui ya lo concatena y lo agrega
                                diccionario.Add(ct, diccionario.Count);
                                c = ((char)t).ToString();
                                //Verificar tamaño de los bits
                                if (diccionario.Count >= LongitudMaxDiccionario)
                                {
                                    LongitudByte++;
                                    LongitudMaxDiccionario = (int)Math.Pow(2, LongitudByte);
                                }
                            }
                        }
                    }
                }
            }
            //Ultima cadena del archivo
            if (!string.IsNullOrEmpty(c))
            {
                string ByteString = Convert.ToString(diccionario[c], 2).PadLeft(LongitudByte, '0'); // produce cadena "00111111";
                bits += ByteString;

                comprimir.Add(diccionario[c]);
            }

            if (bits != "") //Bits restantes
            {
                while (bits.Length % 8 != 0)
                {
                    bits += "0";
                }
                while (bits.Length >= 8) //Escribir bytes en archivo
                {
                    string Byte = bits.Substring(0, 8);
                    bits = bits.Remove(0, 8);

                    ByteArrayToFile(dirEscritura, new[] { Convert.ToByte(Convert.ToInt32(Byte, 2)) });
                }
            }

            #endregion

            #region FileInfo

            FileInfo Fileoriginal = new FileInfo(dirLectura);
            FileInfo FileCompreso = new FileInfo(dirEscritura);
            InfCompresion.agregarNuevaCompresion(new InfCompresion(Path.GetFileName(dirLectura), Fileoriginal.Length, FileCompreso.Length, dirEscritura2)); //Anadir a mis compresiones

            #endregion
        }