Exemplo n.º 1
0
        public ActionResult CompresionHImportar(HttpPostedFileBase ArchivoImportado)
        {
            var NodoRaiz = new Nodo();

            Directory.CreateDirectory(Server.MapPath("~/App_Data/ArchivosImportados/"));
            Directory.CreateDirectory(Server.MapPath("~/App_Data/Compresiones/"));
            var archivoLeer  = string.Empty;
            var ArchivoMapeo = Server.MapPath("~/App_Data/ArchivosImportados/");

            archivoLeer = ArchivoMapeo + Path.GetFileName(ArchivoImportado.FileName);
            var extension = Path.GetExtension(ArchivoImportado.FileName);

            ArchivoImportado.SaveAs(archivoLeer);
            //Obtener propiedades del archivo
            var      PropiedadesArchivoActual = new PropiedadesArchivo();
            FileInfo ArchivoAnalizado         = new FileInfo(archivoLeer);

            PropiedadesArchivoActual.TamanoArchivoDescomprimido = ArchivoAnalizado.Length;
            PropiedadesArchivoActual.NombreArchivoOriginal      = ArchivoAnalizado.Name;
            nombreArchivo = ArchivoAnalizado.Name.Split('.')[0];
            //Leer Archivo
            using (var Lectura = new BinaryReader(ArchivoImportado.InputStream))
            {
                var byteBuffer = new byte[bufferLength];
                while (Lectura.BaseStream.Position != Lectura.BaseStream.Length)
                {
                    byteBuffer = Lectura.ReadBytes(bufferLength);
                    IntroducirALista(byteBuffer);
                }
            }
            TotalDeCaracteres          = ListaCaracteresExistentes.Count();
            NodoRaiz.TotalDeCaracteres = TotalDeCaracteres;
            TextoEnBinario             = NodoRaiz.ArmarArbolHuffman(ListaCaracteresExistentes);
            DiccionarioIndices         = NodoRaiz.DiccionarioIndices;

            while (TextoEnBinario.Length % 8 != 0)
            {
                TextoEnBinario += "0";
            }
            //Escritura Huffman
            using (var writeStream = new FileStream(Server.MapPath(@"~/App_Data/Compresiones/" + nombreArchivo + ".huff"), FileMode.OpenOrCreate))
            {
                using (var writer = new BinaryWriter(writeStream))
                {
                    writer.Write(ArchivoAnalizado.Name.ToCharArray());
                    var Txt = "." + TotalDeCaracteres.ToString();
                    writer.Write(Txt.ToCharArray());
                    writer.Write(Environment.NewLine);
                    foreach (var item in DiccionarioIndices)
                    {
                        var Texto = Convert.ToInt64(item.Value) + "&" + item.Key + "|";
                        writer.Write(Texto.ToCharArray());
                    }
                    writer.Write(Environment.NewLine);
                    var byteBuffer2    = new byte[bufferLength];
                    var contadorBits   = 0;
                    var contadorBuffer = 0;
                    var contador       = 0;
                    var TextoenByte    = "";
                    while (contador != TextoEnBinario.Length)
                    {
                        TextoenByte += TextoEnBinario[contador];
                        contadorBits++;
                        if (contadorBits == 8)
                        {
                            if (contadorBuffer == bufferLength)
                            {
                                for (int i = 0; i < bufferLength; i++)
                                {
                                    writer.Write(byteBuffer2[i]);
                                }
                                byteBuffer2    = new byte[bufferLength];
                                contadorBuffer = 0;
                                byteBuffer2[contadorBuffer] = Convert.ToByte(TextoenByte, 2);
                                contadorBuffer++;
                                contadorBits = 0;
                                TextoenByte  = "";
                            }
                            else
                            {
                                byteBuffer2[contadorBuffer] = Convert.ToByte(TextoenByte, 2);
                                contadorBuffer++;
                                contadorBits = 0;
                                TextoenByte  = "";
                                if (contador == TextoEnBinario.Length - 1)
                                {
                                    for (int i = 0; i < bufferLength; i++)
                                    {
                                        writer.Write(byteBuffer2[i]);
                                    }
                                }
                            }
                        }
                        contador++;
                    }
                    PropiedadesArchivoActual.TamanoArchivoComprimido = writeStream.Length;
                    PropiedadesArchivoActual.FactorCompresion        = Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoComprimido) / Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoDescomprimido);
                    PropiedadesArchivoActual.RazonCompresion         = Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoDescomprimido) / Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoComprimido);
                    PropiedadesArchivoActual.PorcentajeReduccion     = (Convert.ToDouble(1) - PropiedadesArchivoActual.FactorCompresion).ToString();
                    PropiedadesArchivoActual.FormatoCompresion       = ".huff";

                    GuaradarCompresiones(PropiedadesArchivoActual);
                }
            }
            Success(string.Format("Archivo comprimido exitosamente"), true);
            var FileVirtualPath = @"~/App_Data/Compresiones/" + nombreArchivo + ".huff";

            return(File(FileVirtualPath, "application / force - download", Path.GetFileName(FileVirtualPath)));
        }