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); } } }
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 }