Comprimir y descomprimir archivos en zip desde C#

comprimir y descomprimir archivos zip

Hola Csharpedianos, tal vez se te ha presentado la necesidad de crear un archivo comprimido en zip desde c sharp y has tenido problemas con eso ya que hay mucha información en Internet y suele ser confusa en la mayoría de los caso. Es por eso que hoy les traigo este maravilloso post donde les mostrare como comprimir y descomprimir archivos desde C SHARP para luego descargarlos o hacer lo que se nos venga en gana con eso ;).



Para este fin utilizaremos una librería llamada Ionic.Zip.Dll que contiene los métodos para realizar la compresion y descompresión de los archivos.

Estos métodos al ser static pueden ser usados y llamados desde cualquier clase.
Estos método devolverán False en caso de que suceda algún error y no ejecute la acción esperada, en caso contrario revolverá True.

Estos serán los pasos:
  1. Crear un nuevo proyecto de ASP.NET - C SHARP en visual studio.
  2. Agregar la DLL Ionic.Zip.Dll que la pueden descargar Aquí.
    Para esto pueden ver el post de como agregar la Dll Aquí.
  3. Luego llaman el NamesPace:
    using Ionic.Zip;
     
  4. Ahora utilizan el siguiente método para comprimir un archivo:
      
        /// 
        /// Método utilizado para comprimir archivos
        /// 
        /// Ruta del folder que se desea comprimir. (Server.MapPath(...))
        /// el nombre con el que se desea que se guarde el archivo generado. Sin la extension
        /// 
        static public Boolean ComprimirFolder(string Ruta, string Nombre)
        {
    
            try
            {
                using (ZipFile zip = new ZipFile())
                {
                    zip.AddDirectory(Ruta);
    
                    zip.Save(HttpContext.Current.Server.MapPath("temp/" + Nombre + ".zip"));
    
                }
    
                return true;
            }
            catch
            {
                return false;
    
            }
    
        }
    

    El siguiente método utilicenlo para descomprimir los archivos:

     
        /// 
        /// Método utilizado para descomprimir los archivos de un zip file
        /// 
        /// Ruta donde se encuentra el archivo ZIP
        /// Ruta donde se guardaran los archivos extraídos del ZIP
        /// 
        static public Boolean DescromprimirZip(string ArchivoZip, string RutaGuardar)
        {
            try
            {
                using (ZipFile zip = ZipFile.Read(ArchivoZip))
                {
    
                    zip.ExtractAll(RutaGuardar);
                    zip.Dispose();
    
                }
    
                return true;
            }
            catch
            {
                return false;
    
            }
    
        }
    

    Con el siguiente método pueden comprimir una lista de archivos específicos de una carpeta. Para este ejemplo solo tomare los archivos que sean .jpg o .jpeg:


      
        /// 
        /// Método para comprimir una lista de Imagenes, enviando solo la ruta donde se encuentran, no importa que no haya solo imagenes, el metodo le aplica un filtro.
        /// 
        /// Ruta de donde se encuentran las imagenes.
        /// Ruta donde se guardara el archivo Zip
        /// 
        static public Boolean ComprimirListaDeArchivos(string RutaDeArchivos, string RutaGuardar)
        {
            try
            {
                String[] NombreArchivos = Directory.GetFiles(RutaDeArchivos, "*.jp*");
    
                using (ZipFile zip = new ZipFile())
                {
                    zip.AddFiles(NombreArchivos, "");
                    zip.Save(RutaGuardar);
                }
                return true;
            }
            catch
            {
                return false;
            }
        }
    


Una vez que compriman los archivos o los descompriman podrían descargarlos al usuario con el método que expuse en otro post el cual pueden ver Aquí.

Les dejo el proyecto que utilice para estos ejemplos:
Descargar Aqui


 
Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."

Leer más...

Agregar referencias web y locales en Csharp


Una referencia es un acceso a un recurso (Componente, Biblioteca de clases) o a servicios web para acceder a sus metodos, variables o tipos de datos publicos, los cuales realizan operaciones especificas dependiendo de los datos que pasemos o los metodos que llamemos.
Hay varios tipos de referencias pero aqui solo veremos 2, las web que utilizamos para llamar webservices y las locales que utilizamos para llamar dll.
Para agregar una referencia a una dll local lo que tenemos que hacer es lo siguiente:
  1. En el Explorador de soluciones, seleccione la solución a la que desee agregar la referencia. (Si no ve la solución en el Explorador de soluciones, seleccione Opciones en el menú Herramientas, haga clic en Proyectos y soluciones y, a continuación, haga clic en Mostrar solución siempre.
  2.   Click derecho sobre la solucion => Agregar Referencia (Add Reference).




  3. En la ventana que aparece escogemos la pestaña Explorar (Browse) y buscamos la ruta donde esta la dll que queremos agregar:

     La seleccionamos y damos OK.
Ahora veremos que se crea una carpeta llamada Bin (Si no la tenemos creada) y se agregara la Dll que escogimos.


Para agregar un servicio web es de la siguiente manera:

  1. En el Explorador de soluciones, seleccione la solución a la que desee agregar la referencia. (Si no ve la solución en el Explorador de soluciones, seleccione Opciones en el menú Herramientas, haga clic en Proyectos y soluciones y, a continuación, haga clic en Mostrar solución siempre.
  2.   Click derecho sobre la solucion => Agregar Referencia Web (Add Web Reference).  

  3. Se nos abrira una ventana con forma de navegador y pedira la url del WebService, la cual ingresaremos y presionaremos la flecha verde o IR. Luego donde dice "Nombre de referencia web" colocaremos un nombre para identificar al servicio y preionamos el boton que dice "Agregar referencia (Add Reference)" y listo hemos terminado.

Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."


Leer más...

Forzar la descarga de un archivo desde Csharp



descarga de archivos


 En muchas ocasiones queremos que nuestro sistema descargue un archivo pdf o cualquier archivo  automaticamente y no se abra en el navegador ya sea porque es un requerimiento o nuestra conciencia nos dice que debe ser asi, sea cual sea el motivo aqui les dejo un codigo para que puedan descargar cualquier tipo de archivo.

 Este metodo lo podran colocar en cualquier clase y descargar el archivo sin importar de que pagina sea llamado,  lo pueden colocar en una clase Utilidades por ejemplo.

 Y es el siguiente:

  static public void Download(string patch)
    {
        System.IO.FileInfo toDownload =
                   new System.IO.FileInfo(HttpContext.Current.Server.MapPath(patch));

        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader("Content-Disposition",
                   "attachment; filename=" + toDownload.Name);
        HttpContext.Current.Response.AddHeader("Content-Length",
                   toDownload.Length.ToString());
        HttpContext.Current.Response.ContentType = "application/octet-stream";
        HttpContext.Current.Response.WriteFile(patch);
        HttpContext.Current.Response.End();
    }


Como parametro pasamos la ruta donde se encuentra el archivo:
Ej: Download("temp/temp.zip");

 Este codigo es muy util en la parte funcional y en seguridad ya que ahorra hacer otros pasos para descargar los archivos y no expone la ruta de los documentos.

Les dejo un ejemplo muy bueno que hice para este post, tiene mucho codigo que les puede servir. :)
Descargar Aqui.

Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."
Leer más...

Encriptar y desencriptar columna en sql server y asp.net


Hola Csharpedianos, nevegando un poco por la red (como suelo hacerlo por 9 horas diarias de lunes a viernes) me encontre con algo muy interesante y que necesitaba por cierto y se trata de como encriptar y desencriptar una columna en sql server. Esto lo pueden utilizar para contraseñas, tarjetas de credito o lo que quieran.

Les cuento que he copiado y pegado el post de la web cjorellana.net para ahorrarme lo de escribir, ademas de eso se trata este blog, compartir informacion. ;)

Acá les proporciono un ejemplo de como crear una tabla de usuarios con el campo de Contraseña encriptado, luego veremos desde una pagina aspnet como podemos validar el usuario contra dicha tabla.

1.) Crear el master key

/* Crea la key master */
USE northwind
GO
CREATE MASTER KEY ENCRYPTION
BY PASSWORD = 'SQLAuthority'
GO

2.) Crear el certificado de encriptacion

/* Crea certificado de encriptacion */

CREATE CERTIFICATE EncryptTestCert
WITH SUBJECT = 'SQLAuthority'
GO

3.) Crea la  Symmetric Key

/* Crea Symmetric Key */
CREATE SYMMETRIC KEY TestTableKey
WITH ALGORITHM = TRIPLE_DES ENCRYPTION
BY CERTIFICATE EncryptTestCert
GO

4.) Crea la tabla

Create Table Usuarios
(
    IdUsuario    int identity(1,1) primary key,
    Usuario        varchar(50),
    Contrasena    VARBINARY(256)
)


5.) Crea store procedure de ingrear usuarios

create proc Ingresa_usuario
(
    @Usuario        varchar(50),
    @Contrasena        varchar(50)
)
as

OPEN SYMMETRIC KEY TestTableKey DECRYPTION
BY CERTIFICATE EncryptTestCert

insert into usuarios(Usuario,Contrasena)
values(@Usuario, ENCRYPTBYKEY(KEY_GUID('TestTableKey'),@Contrasena))
               
5.1) Ingresando usuarios a través del store procedure

/* Ingresando usuarios con el store procedure */
exec Ingresa_usuario 'usuario1','password'
exec Ingresa_usuario 'usuario2','P@ssw0rd'

/* muestra la columna encriptada */
select * from usuarios 


/* verificando que las contraseñas estén correctamente almacenadas. */

OPEN SYMMETRIC KEY TestTableKey DECRYPTION
BY CERTIFICATE EncryptTestCert
SELECT Usuario,CONVERT(VARCHAR(50),DECRYPTBYKEY(Contrasena)) AS Contrasena
FROM usuarios
insert into usuarios(Usuario,Contrasena)



 6.) Crear store procedure de validar usuarios

create proc Valida_usuario
(
    @Usuario        varchar(50),
    @Contrasena        varchar(50)
)
as

OPEN SYMMETRIC KEY TestTableKey DECRYPTION
BY CERTIFICATE EncryptTestCert
SELECT count(*) as Contar
FROM usuarios
where Usuario=@Usuario
and CONVERT(VARCHAR(50),DECRYPTBYKEY(Contrasena))=@Contrasena
CLOSE SYMMETRIC KEY TestTableKey
  
Ahora en Visual Studio .net crearemos la pagina de validación


Creando pagina de login.


7.)  Agregue un pagina con el nombre de Login.aspx (clic en el menu web site new ítem)





8.) En la pagina agregue un control de login a la pagina desde el toolbox.






8.1) Su pagina se mirara así:




8.2) Capture el evento Authenticate del control login1 y agregue el código de autenticación (precione doble clic sobre el control para generar el evento) este evento tendrá el código de autenticar.


protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
}
 
Validando con Linq to SQL Classes 

9) Agregue un contexto  haciendo click derecho sobre su proyecto, luego presioné "add item" y luego busque Linq to SQL Classes, agregue un nombre y luego add.






10) Habra su contexto y desde el server explorer arrastre los store procederes realizados en los pasos anteriores( paso 6 y 5), esto crea automáticamente 2 funciones que hacen referencia a los store procedure.






11) Validando usuarios en el evento Authenticate del paso 8.2:


protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    { 
        DataClassesDataContext db = new DataClassesDataContext();

        var query = db.Valida_usuario(Login1.UserName, Login1.Password).Single(); 

        if (query.contar > 0 )
        { 
           //password correcto
            System.Web.Security.FormsAuthentication.SetAuthCookie(Login1.UserName, false);
            Response.Redirect("Default.aspx"); 
        } 
        else
        { 
            //password incorrecto
            Login1.FailureText = "Usuario o password incorrecto"; 
        } 

    }


Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."
Leer más...
Google