Clinic gratuito de ASP.NET Ajax Extensions

Interesado en aprender más y más de asp.net ajax cada día? aca va un recurso más para todos uds, el Clinic 5230 que lo pueden encontrar en MicrosoftEalearning, en solo dos horas puedes ir introduciendote al maravilloso mundo de ajax :),  aca la url:


https://www.microsoftelearning.com/eLearning/courseDetail.aspx?courseId=73568


 Disfrútenlo, esta interesantísimo.


 Ivan Mostacero.


http://www.msdnlive.net/

Intellisense en Javascript y mas … En Orcas

Una de las preguntas que siempre me han hecho en las presentaciones que he tenido respecto a Ajax es el soporte intellisense que se puede dar al mismo, si bien es cierto Visual Studio 2005 tiene un soporte básico para trabajar con Javascript pero como que no se integra con las nuevas características de ASP.NET Ajax.


Ahora con Visual Studio «Orcas» tendremos este soporte y más [:D] ya que se integrará completamente con ASP.NET Ajax, entre las funcionalidades que tendremos está la «lista de autocompletar» que automáticamente nos va a ir ayudando con las palabras claves de acuerdo a los caracteres que vayamos tipeando, ojo no solo hablamos que nos va a ayudar con el javascript clásico sino también con las palabras reservadas y namespaces que vienen con ASP.NET Ajax, eso es lo realmente excelente [:)], la siguiente pantalla muestra esa caracteristica:


 


Además de ello también tendremos los clásicos tooltips de ayuda de las principales funciones y métodos, tal como es con sus lenguajes de desarrollo preferidos [:D], como lo pueden notar en la siguiente imagen:



Y para sumar a todo esto, también se ha definido una forma de poder tener intellisense sobre los archivos javascript externos que nosotros referenciemos, si como lo lees, si tienes librerías que hayas implementado, estás no quedarán fuera de esta nueva funcionalidad, ya que referenciandolos de cierta manera podrás gozar de todo el poder del intellisense que te ayudará a trabajar de manera más sencilla y productiva, la referencia a estos archivos se realizaría de la siguiente manera:


 


Otra de las funcionalidades realmente interesantes es que ahora puedes documentar tus funciones o lo que creas conveniente en la forma que lo realizabas con tus lenguajes de programación preferidos, de la siguiente manera:

 


Cuanto agregues estos comentarios a tus funciones, al momento de utilizar las mismas estos se mostrarán como tooltips de ayuda de la siguiente manera:


 


Realmente una excelente noticia, son muchas las mejoras y novedades que vienen con «Orcas», sin duda será de mucha ayuda para todos nosotros,


Referencias:
http://weblogs.asp.net/scottgu/archive/2007/04/24/javascript-intellisense-in-visual-studio-orcas.aspx
http://weblogs.asp.net/bleroy/archive/2007/04/23/the-format-for-javascript-doc-comments.aspx
http://blogs.msdn.com/webdevtools/archive/2007/03/02/jscript-intellisense-in-orcas.aspx
http://blogs.msdn.com/webdevtools/archive/2007/03/09/jscript-debugging-in-visual-web-developer-orcas.aspx


Saludos,


Ivan Mostacero.

http://www.msdnlive.net/

[Tip] Descarga de archivos bajo SSL

En estos dias, en mi centro de labores, nos encontramos en el proceso de migracion de un sistema que estaba corriendo bajo el framework v1.1 hacia la version 2.0, justo el dia de hoy estuve realizando unas pruebas de las diversas funcionalidades y me encontre con un pequeño problema al intentar realizar la descarga de algunos archivos Excel, problema que bajo la misma configuracion en la v1.1 no se daba, lo mismo sucedio con algunos documentos xsl que utilizabamos para dar formato a documentos XML utilizando DOM a traves de javascript, todo esto se daba bajo un entorno HTTPS, asi que me puse manos a la obra para intentar detectar cual era el posible problema.


Para ello me ayude de un utilitario al cual le he cogido bastante cariño 🙂 se llama Web Development Helper, desarrollado por nuestro amigo Nikhil Kothari que, entre otras funcionalidades, nos permite realizar un logging de la informacion que se intercambia entre el cliente y servidor, utilizando esta herramienta pude obtener que viajaba la siguiente informacion entre el cliente y el servidor, tal como lo muestro en el siguiente grafico:



 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


Lo importante que debemos notar en la imagen es los «response headers«, el elemento «Cache-Control«, como podemos ver la imagen esta descargando con el atributo seteado a «no-cache», esto significa que la informacion no se va a almacenar en cache y es la causa del problema ya que para poder leer o «guardar-como» el documento este primero debe alojarse en algun espacio temporal del cliente y debido a este atributo esto no esta sucediendo por lo que luego cuando el navegador intente mostrar el documento simplemente no lo va a encontrar 🙁


Ahora, yo en ningun momento defini que este atributo se seteara de este modo, pero debido a trabajar en un entorno https, automaticamente se agrega como parte de los mecanismos de seguridad, existen varios mecanismos a traves de programacion o directivas que se podrian aplicar para modificar este comportamiento, pero debido a que yo generaba un enlace hacia el archivo no tenia forma de aplicarlas, asi que recurri a la configuracion en el IIS, sobre la carpeta donde se encontraban estos archivos 🙂 en sus propiedades, en el Tab Http Headers encontramos una seccion llamada «Custom HTTP Headers» en donde podemos setear atributos o modificar los que ya vienen ( como una sobreescritura de los mismos asi que cuidado con lo que se agregue o modifique 🙂 ).


Para este caso en particular agregue un nuevo atributo justamente el que veniamos discutiendo lineas atras, el atributo «Cache-control» el cual lo setee a un nuevo valor en este caso a «public», la configuracion quedaria de la siguiente manera:



y ahora bien utilizando nuevamente la herramienta para el logging ahora obtenemos la siguiente respuesta:


Como podemos notar con la accion antes realizada sobre el IIS ha generado que el atributo «cache-control» haya sobreescrito su valor original, y perfecto ahora ya tengo disponibles una vez mas nuestros archivos para descarga :D, ya que esta directiva origina que nuestros documentos puedan almacenarse en la cache del cliente para su posterior lectura de la misma.


Por cierto tambien les dejo un enlace de como trabajar la cache directamente desde ASP.NET del equipo de soporte de Microsoft:


Cómo a caché utilizando Visual C # .NET en ASP.NET


Para mayor informacion sobre los http headers tenemos la siguiente URL:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html


 


Espero sea de utilidad para quien lo necesite 🙂 ,


Ivan Mostacero

http://www.msdnlive.net/

Microsoft Web Days, una larga jornada

Realmente una gran semana, el sabado termino todo el tour en Peru de los Web Days, en mi caso debido a cuestiones laborales que me impedian viajar al interior del pais, estuve cubriendo los tracks en Lima, fueron 3 en total, de los cuales uno fue orientado solo a empresas (dia Jueves) y los otros dos orientados a publico profesional en general, pero no solo fueron las 3 charlas ya que si a ellas le sumamos la charla dada en SISE el sabado pasado y en la UNI el sabado por la tarde podriamos decir que fue toda una jornada de charlas bastante satisfactorias.


Recuerdo que hace un año, en el MSDN Regional tour ya habia tratado el tema de Ajax(En esa epoca bajo el codename de Atlas), los participantes si bien es cierto estaban bastante interesados en el tema de Ajax, recien observaban el mundo de posibilidades que se les abria al trabajar con Atlas, para este año note una mayor participacion del publico ya que muchos de ellos venian trabajando con el producto y realmente me dio mucho gusto lo emocionados que detallaban su experiencia con el mismo, esos detalles te hacen sentir que vale la pena difundir un producto desde sus inicios.


Me comentaba una persona que estuvo en una de las charlas como es que de acuerdo a como avanzaba con las demos, el en su mente iba dibujando como seria su web actual si agregaba todas las funcionalidades que ajax te daba, realmente me emociono mucho el saber como una charla puede darte un mundo de posibilidades aplicables en el mundo real que te ayuden a mejorar lo que ya tienes.


Es elogiable el trabajo que Microsoft Peru a realizado en estos Web Days, con un total de 10 charlas tanto en Lima como en provincias, todas exitosas, felicito ademas a todos los influencers por toda la labor encomiable realizada de manera voluntaria, sin mayor interes que el de compartir el conocimiento con las personas que esten interesadas en aprender, no sigo extendiendome, solo decirles gracias a todos los que participaron en estos Web Days, estoy seguro que ha sido una muy buena experiencia tanto para ponentes como participantes.


Como les comente en las presentaciones quede en publicar las demos y ppt, y aqui cumplo con ello 🙂 les adjunto las mismas, tener en cuenta que para probar la demo de Application Services se requiere instalar la base de datos para manejo de Membership (Si recuerden aspnet_regsql.exe xD ) y ademas crear un usuario valido para loguearse.


 


Base de Datos
PPT
Demostraciones


Saludos cordiales,


Ivan Mostacero.

http://www.msdnlive.net/

Codeplex y Ajax Control Toolkit

Realmente es impresionante como está creciendo este sitio, y lo que lo hace más interesante aún es que crece por la colaboración de toda la comunidad, CodePlex se está convirtiendo en uno de los sitios favoritos de búsqueda para nuevos controles que puedan ser usados en nuestros proyectos, pero lo más importante aún es que en el mismo lugar es donde las personas aportan y mucho para el crecimiento del producto, tanto a traves de detección de bugs, recomendación de nuevas funcionalidades, colaboración con otras personas a traves de los foros, entre muchas otras formas.


Para mostrarles un ejemplo podemos citar el caso del proyecto Ajax Control Toolkit, podemos encontrar variada información sobre el mismo, por ejemplo a esta fecha se tiene definidos de forma tentativa los siguientes release del producto que serían:


10228: We have marked this release to be around end of February tentatively. It will include bug fixes and possibly some new controls that are already in prototype. Currently there are 137 active bugs in this bucket. If you think that a specific bug assigned to you does not block core functionality and could be postponed to make time for more pressing issues feel free to move it to the next release.

10330: This is the next release set to be around the end of March. It is subject to change.


Además también se va informando de los nuevos controles en los que se viene trabajando:


  • AnimatedSiteMapMenu
  • ListSearchExtender (Ya liberado)
  • SlideShowExtender (Ya liberado)
  • BalloonPopupExtender

  • Y también una lista de posibles nuevos controles que se irán incorporando a este Toolkit:


  • ProfileBindings: We are considering bringing back ProfileBindings support into the toolkit but have not made a decision yet
  • ImageMapExtender: Extender to an ImageMap that shows a custom hover-menu when mousing over hotspots
  • ScrollPositionExtender: Extender to panelstextbox controls with scrollbars that remembers scrollbar positions across postbacks
  • CollapsibleSplitterPanel: Collapsible panel with resize support on the panels
  • HistoryBackButton Control:
  • Check allnone for grid: An extender for a check box that can check/uncheck all the check boxes in a grid.
  • ContextMenu: Relevant menu for controls available on right clicking


  • Technorati:


  • A control where a user can scale an image or part of an image with some nice animation or transition effect
  • Visual Studio like pinnable sliders: Sliders which slide in and out of view, but can be pinned so they stay in place. On pinning, a event can be sent to save the pin-state at the server.
  • SaveStateExtender: Extender that prompts the user to save changes made to a control(s) when they attempt to navigate elsewhere without saving.
  • ContextMenu: Relevant menu for controls available on right clicking.

  •  


    Wow, realmente de lo mejor, en cierto modo me gusta y mucho esta nueva forma de trabajo adoptada por el equipo de microsoft y los felicito por ello, creo que esa es la mejor forma de hacer comunidad, ahora tu también puedes colaborar y creo que en cierto, es nuestra obligación hacerlo, si me preguntas como hacerlo? muy sencillo, aca te va una URL donde puedes justamente reportar un bug, algun nuevo problema, o una nueva funcionalidad:


    http://www.codeplex.com/AtlasControlToolkit/WorkItem/AdvancedList.aspx


    Ahora también importante es que no solo dejas tu bug y ya sino que tienes la posibilidad de hacerle seguimiento día a dia y ver el estado actual en el que se encuentra, realmente de lo mejor 🙂 una vez mas mis felicitaciones a todo el equipo de Codeplex por el gran trabajo que se viene realizando, y a todos ustedes por todos los aportes que se dan día a día y que sirven en mucho para el crecimiento de los productos.


    Realmente una felicitación tambien a todos nosotros y sigamos adelante haciendo crecer esta comunidad tan de la forma tan apasionante como lo venimos haciendo hasta ahora 🙂


    Salu2,


    Ivan Mostacero.

    http://www.msdnlive.net/

    ScriptManager y ClientScript en ASP.NET Ajax

    Uno de los cambios que se han dado dentro de asp.net ajax es la generación de javascript en el lado del servidor, y es que sucede que ahora uds. encontrarán van a encontrar los diversos métodos que se tienen dentro del «Page.ClientScript» tambien definidos dentro de la clase «Microsoft.Web.UI.ScriptManager».

    En si esto como que es un poco confuso, pongamos un ejemplo, que tal si Uds. Quisieran desarrollar un Custom Control en el cual tuvieran la necesidad de Registrar un Control Hidden, normalmente realizarían lo siguiente:

      1 Page.ClientScript.RegisterHiddenField(this.ID, «»);

    Esa es la forma tradicional de registrar el Hidden, ahora si ese control es usada en una página aspx que se basa en postbacks funcionaria de manera correcta, pero que sucede si se usara en una página basada en partial postbacks, con asp.net ajax como motor asíncrono, pues la respuesta es sencilla, simplemente no generaría el control Hidden, asi que si están teniendo este pequeño problema no se preocupen aca tenemos una alternativa 🙂

    Esto es debido a que si uds quieren utilizar estos métodos en una página basada en asp.net ajax deben usar los métodos que vienen dentro de «Microsoft.Web.UI.ScriptManager» ahora también recuerden que dentro de una página basada en ajax también existe la posibilidad de hacer postbacks, por lo tanto una posible solución basada en código sería la siguiente:


     

      1 if (Microsoft.Web.UI.ScriptManager.GetCurrent(this.Page) != null){
    2 if (Microsoft.Web.UI.ScriptManager.GetCurrent(this.Page).IsInAsyncPostBack){
    3 Microsoft.Web.UI.ScriptManager.RegisterHiddenField(this, this.ID, «»);
    4 }
    5 else{
    6 Page.ClientScript.RegisterHiddenField(this.ID, «»);
    7 }
    8 }
    9 else{
    10 Page.ClientScript.RegisterHiddenField(this.ID, «»);
    11 }


     


    Lo que hacemos en este snippet es primero, verificar si existe algun control ScriptManager dentro de la página, de esta forma descartamos si estamos usando o no asp .net ajax, en caso no exista entonces no es una pagina aspx que use ajax, por consiguiente un simple Page.ClientScript.RegisterHiddenField estaría OK.

    El otro caso es que si este usando un control ScriptManager, ya que esto nos obliga a verificar si esta en un postback normal o en un «partial postback», para ello usamos la propiedad «IsInAsyncPostBack» del ScriptManager actual, si la respuesta es verdadera implica que estamos en un partial Postback por lo que para registrar el control Hidden ahora requerimos usar el método dentro de la clase ScriptManager, de la siguiente manera:
     

      1 Microsoft.Web.UI.ScriptManager.RegisterHiddenField(this, this.ID, «»);


    En caso la respuesta sea incorrecta entonces solo usamos un simple Page.ClientScript.RegisterHiddenField.


     


    Espero sea de utilidad para Uds. a mi me ayudo en el momento de migrar a la ultima version de asp.net ajax.

    Saludos cordiales,

    Ivan Mostacero.

    http://www.msdnlive.net/

    Validacion Modulo 10 para tarjetas de credito

    Módulo 10 no es mas ni menos que un algoritmo usado para validar un sin número de numeros de identifcación, comunmente se la relaciona a tarjetas de crédito pero en perú también es usado en otros números de identifiación como por ejemplo en la C.C.I. (Código de cuenta interbancaria) que es brindada por la Cámara de Compensación Electrónica y que sirve como identificador único para la realización de transferencia entre cuentas de diferentes bancos de perú.

    Este algoritmo fue creado por Hans Peter Luhn en IBM y es un algoritmo de dominio público, en si no es un algoritmo hash ni nada por estilo ( tampoco pretende serlo) sino simplemente sirve para evitar errores accidentales al usar estos identificadores.

    Más información al respecto la tenemos en WikiPedia, con ejemplos tanto para la generación y validación, además les dejo otro algoritmo usado para el mismo fin por si necesiten usarlo:

      1 public static  bool ValidaModulo10(string strNumeroValidar)
    2 {
    3 strNumeroValidar = Regex.Replace(strNumeroValidar, @»[^0-9]», «»);
    4 int LongitudCadena = strNumeroValidar.Length;
    5 int intImpar = 0;
    6 int intUniforme = 0;
    7
    8 char[] arrNumero = new char[LongitudCadena];
    9 arrNumero = strNumeroValidar.ToCharArray();
    10 Array.Reverse(arrNumero, 0, LongitudCadena);
    11 for (int i = 0; i < LongitudCadena; i++)
    12 {
    13 if (i % 2 == 0)
    14 {
    15 intImpar += (Convert.ToInt32(arrNumero.GetValue(i)) – 48);
    16 }
    17 else
    18 {
    19 int intTemp = (Convert.ToInt32(arrNumero[i]) – 48) * 2;
    20 if (intTemp > 9)
    21 {
    22 intTemp = intTemp – 9;
    23 }
    24 intUniforme += intTemp;
    25 }
    26 }
    27 if ((intImpar + intUniforme) % 10 == 0)
    28 return true;
    29 else
    30 return false;
    31 }


    Espero les sea de ayuda,

    Ivan Mostacero

    http://www.msdnlive.net/

    Como crear Temas a nivel de Sitio Web

     


    Con la llegada de ASP.NET vinieron muchas nuevas características, una de ellas es la creación de temas que nos permiten generar un diseño estándar para nuestra aplicación con la posibilidad de poder generar múltiples temas para que nuestros usuarios puedan elegir de acuerdo a sus preferencias.

    La creación de temas puede darse tanto a nivel de Aplicación Web como a nivel de Sitio Web, si hablamos a nivel de aplicación web, los temas se almacenan dentro de un directorio especial llamado «App_Themes«, en donde podemos crear directorios adicionales por cada tema que tengamos disponibles. Dentro de estos directorios particulares es en donde van a almacenarse nuestros «skins«, hojas de estilo, imágenes que va a requerir nuestro diseño para una presentación estándar.

    Ahora también existe la opción de crear temas globales a nivel de sitio web que puedan ser reutilizables por todas nuestras aplicaciones web, ahora les explicaré el procedimiento para lograrlo.

    Paso 01. Crear una carpeta llamada «Themes» en la siguiente ruta: «rootiis_sitiowebaspnet_clientsystem_webversion», en donde «rootiis_sitioweb» viene a ser la ruta por defecto a la que apunta nuestro Sitio Web y la parte de la «version» hace referencia a la versíón de asp.net usando, por ejemplo 2_0_50727. En mi caso quedó de la siguiente manera:
    C:Inetpubwwwrootaspnet_clientsystem_web2_0_50727Themes



    Paso 02: Crear nuestros temas específicos dentro de la carpeta que acabamos de crear anteriormente, se pueden crear los temas que sean necesarios, sin restricciones. Por ejemplo yo podría crear los siguientes temas:

    C:Inetpubwwwrootaspnet_clientsystem_web2_0_50727ThemesDefault
    C:Inetpubwwwrootaspnet_clientsystem_web2_0_50727ThemesAzul
    C:Inetpubwwwrootaspnet_clientsystem_web2_0_50727ThemesRojo



    Paso 03: Agregar a cada uno de los temas antes creados el contenido necesario tal como Skins, Hojas de Estilo, Imágenes.

    Es altamente recomendable crear primero los temas como parte de alguna aplicación web, para poder hacer las pruebas necesarias y luego de ello ya subirlas a nivel de Sitio Web,

    Espero sea de ayuda,

    Ivan Mostacero.

    http://www.msdnlive.net/

    Compresion y descompresion en el .NET Framework 2.0

    Descargar Fuente


    El intercambiar datos dentro de nuestra organización sería mucho mas eficiente si estos datos no ocuparan mucho espacio ya que de ese modo al ser transferidos sobre nuestra red no la sobrecargarían y el transporte sería muchísimo mas rapido. Existen muchos algoritmos para compresión de datos tanto de caracter privado como publico y que pueden ser utilizados para este propósito.

    Microsoft, conociendo la importancia de tener estos algoritmos y de su uso, ha implementado dentro del Framework 2.0 un conjunto de clases que nos permita utlizarlos de manera muy sencilla y rápida, estas clases las podemos encontrar dentro del Namespace «System.IO.Compression», y se llaman DeflateStream y GZipStream. 

    La clase DeflateStream usa el algoritno de compresión «DEFLATE» que lo podemos encontrar detallado en el RFC 1951 (URL: http://www.faqs.org/rfcs/rfc1951.html) y que es libre sin patentes ni nada por el estilo e implementado en muchas herramientas de compresión, en si se basa en la combinación del Algoritmo LZ77 y la codificación Huffman.

    Ahora la clase GZipStream se basa también en el algoritmo de compresión DEFLATE agregándole cierta metadata tanto en la cabecera y un pie de página. Por lo mismo dentro del framework 2.0 se podría decir que GZipStream es una simple extensión de la clase Deflate con el agregado de una cabecera y un pie de página haciendolo compatible con otros comprimidores/descomprimidores tal como es WinZip o Winrar ( Ojo en el caso de estos productos, además de permitir comprimir/Descomprimir manejan tambien el concepto de archivameinto por lo tanto los resultados que obtengamos comparados a estos productos no van a ser los mismos).

    Tambien podríamos decir que en .NET se tiene la restricción a un máximo de 4 Gigas de tamaño para usar estas clases, aunque no es un gran inconveniente, se podría decir que es totalmente manejable 🙂

    Ahora la implementación del mismo es muy sencilla, como primer paso requerimos hacer lo siguiente:

      1 using System.IO.Compression;



    De esta forma importamos el namespace que nos va a permitir trabajar con las clases ya definidas anteriormente:
    Luego de ello vamos a definir un método que nos permita realizar la compresión usando la Clase GZipStream:

      1 public static void GZipCompresion(string strNombreArchivo)
    2 {
    3 FileStream fsArchivo;
    4 try
    5 {
    6 // Leemos el archivo a comprimir
    7 fsArchivo = new FileStream(strNombreArchivo, FileMode.Open, FileAccess.Read, FileShare.Read);
    8 //Definimos el buffer con el tamaño del archivo
    9 byte[] btBuffer = new byte[fsArchivo.Length];
    10 //Almacenamos los bytes del archivo en el buffer
    11 int intCount = fsArchivo.Read(btBuffer, 0, btBuffer.Length);
    12 fsArchivo.Close();
    13
    14 //Definimos el nuevo stream que nos va a permitir grabar el zip
    15 FileStream fsSalida = new FileStream(strNombreArchivo + «.zip», FileMode.Create, FileAccess.Write);
    16 //Rutina de compresion usando GZipStream
    17 GZipStream gzsArchivo = new GZipStream(fsSalida, CompressionMode.Compress, true);
    18 //Escribimos el resultado
    19 gzsArchivo.Write(btBuffer, 0, btBuffer.Length);
    20 gzsArchivo.Close();
    21
    22 //Cerramos el archivo
    23 fsSalida.Flush();
    24 fsSalida.Close();
    25
    26 MessageBox.Show(«Compresion realizada correctamente al archivo: « + strNombreArchivo + «.zip»);
    27 }
    28 catch (Exception ex)
    29 {
    30 MessageBox.Show(«Ocurrió un error al comprimir: « + ex.Message);
    31
    32 }
    33 }


     

    Y con eso ya tendríamos implementado el método para comprimir, para llamarlo desde un formulario windows podríamos realizar lo siguiente:

      1 private void btnComprimir_Click(object sender, EventArgs e)
    2 {
    3 OpenFileDialog ofd = new OpenFileDialog();
    4 if (ofd.ShowDialog() == DialogResult.OK)
    5 {
    6 GZipCompresion(ofd.FileName);
    7 }
    8 }

    Ahora para realizar la descompresión se torna un poquito más complicado debido a que se requiere el tamaño del buffer en donde almacenar el resultado de la descompresión, aca tenemos la implementación del mismo:


     

      1 public static void GZipDescompresion(string strNombreArchivo)
    2 {
    3 FileStream fsArchivo;
    4 try
    5 {
    6 //Leemos archivo a descomprimir
    7 fsArchivo = new FileStream(strNombreArchivo, FileMode.Open, FileAccess.Read, FileShare.Read);
    8 GZipStream gzsArchivo = new GZipStream(fsArchivo, CompressionMode.Decompress);
    9
    10 //Codigo implementado para conocer las dimensiones que va a tener nuestro buffer, acumulativo.
    11 int offset = 0;
    12 int intCountBytes = 0;
    13 byte[] btSmallBuffer = new byte[100];
    14 while (true)
    15 {
    16 int bytesRead = gzsArchivo.Read(btSmallBuffer, 0, 100);
    17 if (bytesRead == 0)
    18 {
    19 break;
    20 }
    21 offset += bytesRead;
    22 intCountBytes += bytesRead;
    23 }
    24 //Creamos el buffer con el tamaño requerido
    25 byte[] buffer = new byte[intCountBytes];
    26
    27 //Leemos el contenido del archivo comprimido al buffer
    28 fsArchivo = new FileStream(strNombreArchivo, FileMode.Open, FileAccess.Read, FileShare.Read);
    29 gzsArchivo = new GZipStream(fsArchivo, CompressionMode.Decompress);
    30 int intCount = gzsArchivo.Read(buffer, 0, intCountBytes);
    31 gzsArchivo.Close();
    32
    33 //Escribimos la salida a un nuevo archivo, ya descomprimido
    34 FileStream fsSalida = new FileStream(strNombreArchivo.Substring(0, strNombreArchivo.Length – 4), FileMode.Create, FileAccess.Write);
    35 fsSalida.Write(buffer, 0, intCountBytes);
    36 fsSalida.Flush();
    37 fsSalida.Close();
    38
    39 MessageBox.Show(«Descompresion realizada correctamente al archivo: « + strNombreArchivo.Substring(0, strNombreArchivo.Length – 4) + «.zip»);
    40
    41 }
    42 catch (Exception ex)
    43 {
    44 MessageBox.Show(«Ocurrió un error al descomprimir: « + ex.Message);
    45
    46 }
    47 }


     

    Para llamar a este método desde un formulario windows:

      1 private void btnDescomprimir_Click(object sender, EventArgs e)
    2 {
    3 OpenFileDialog ofd = new OpenFileDialog();
    4 if (ofd.ShowDialog() == DialogResult.OK)
    5 {
    6 GZipDescompresion(ofd.FileName);
    7 }
    8 }



    Bastante sencilla la implementación, y es que justamente para ello esta el Framework, para hacernos la vida mas sencilla 🙂

    Espero sea de utilidad, luego publicaré el código fuente para su descarga,

    Feliz Navidad 🙂

    Ivan Mostacero