Ver Mensaje Individual
  #151 (permalink)  
Antiguo 11/03/2009, 00:02
Irvin1985
 
Fecha de Ingreso: marzo-2009
Mensajes: 9
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: FAQ´S del foro de Net

Tema: Windows Forms
Pregunta: ¿Cómo crear un contenedor de archivos, tipo archivo zip?
Respuesta:

Puedes crear una clase donde almacenes en memoria los archivos y utilizar los metodos serializar y deserializar para guardarlos en un contenedor de archivos.

En este caso, explico un ejemplo con imagenes, pero se puede hacer con cualquier otro archivo.

Formulario Principal, ocupas 2 botones y un PictureBox1 con los nombres por defecto.

Código:
Imports System
Imports System.IO
Imports System.Collections
Imports System.Text
Imports System.Xml

Public Class Form1

    'FileClass es la clase que contiene todas las imagenes, esta clase contiene 2 
    'funciones, una se llama GetImagen(nombreimagen) y otra que se llama
'addImagen(nombreimagen,laimagen)

    Public cd As FileClass

    'En este caso mi archivo contenedor se llama files.dat

    Public strPath As String = "C:\files.dat"

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        cd = New FileClass
        cd = Deserialize(strPath)

        'La funciom Desearialize se encuentra en un modulo, pero la puedes poner 
        'en el formulario, tu eliges. Esta funciona es la que extrae los archivos del 
        'contenedor

        PictureBox1.Image = cd.GetImagen("imag (3).jpg")

        'Utilizo el picturebox para comprobar si me extrajo el archivo, en este caso
        ' una imagen al azar. En este caso mando llamar a esta la funcion 
        'GetImagen  ya que es la que me trae la imagen por medio del nombre.
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        cd = New FileClass

        'En esta parte agrego las imagenes que tengo en la carpeta c:\imag el cual
        'contiene 12 imagenes llamadas imag (1), imag(2) ..... Imag (12).jpg, pero tu 
        'lo puedes modificar para que agrege como tu quieras, ya se por medio de 
        'un openfiledialog u otra forma.

        For i As Integer = 1 To 12

            'Cargo la imagen en la memoria

            Dim img As New Bitmap("C:\imag\imag (" & i & ").jpg")

            'la guardo en la case Fileclass con la funcion AddImagen(nombreimagen,imagen).

            cd.AddImagen("imag (" & i & ").jpg", img)
        Next

'Una vez guardadas las imagenes en la clase fileclass, creo el contenedor con la 
'funcion Serialize(larutadelarchivocontenedor,laclasefileclass)

        Serialize(strPath, cd)
    End Sub
End Class
La clase FileClass, es la que hace la magia, esta clase almacena las imagenes y ademas contiene 2 funciones addimagen y getimagen.

En esta clase tengo 2 arreglos de tipo arraylist, ImagenName que guarda el nombre de la imagen y ImageFile que guarda la imagen cargada en la memoria.

Código:
<Serializable()> _
Public Class FileClass
    Dim imageName As New ArrayList
    Dim ImageFile As New ArrayList
 
    ' Esta funcion Guarda las imagenes y el nombre en los arreglos, si quieres 
'guardar otro tipo de archivo, entonces cambia el parametro "imagen as Bitmap" 
'como files as Object o el tipo del archivo que quieras.
'Si te fijas bien guardo el nombre del a imagen y la imagen a la vez, con esto los 
'indices de los 2 arreglos van a concordar.
 
   Public Sub AddImagen(ByVal nombre As String, ByVal imagen As Bitmap)
        imageName.Add(nombre)
        ImageFile.Add(imagen)
    End Sub


  'Esta funcion extrae la imagen guardada en el arreglo, entonces la llamo con el 
'nombre del la imagen. Como los 2 arreglos concuerdan con los indices, entonces 
'obtengo el indice del arreglo imageName por medio de 
'IndexOf(nombredelaimagen) y con ese indice obtengo la imagen guardada en el 
'areglo ImageFile con Item(indicedelaimagen) y la retorno
 
   Public Function GetImagen(ByVal nombre As String) As Bitmap
        Return ImageFile.Item(imageName.IndexOf(nombre))
    End Function
End Class
Y por ultimo el Modulo, el cual contiene las funciones Serialize y Deserialize, el cual nos crearan los contenedores.
Serialize para crear el archivo contenedor y Deserializa para extraer los datos del Archivo contenedor

Código:
Imports System.IO
Imports System.Collections
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization.Formatters.Soap
Imports System.Runtime.Serialization
Imports System.Text

Module Module1

    Friend Sub Serialize(ByVal strPath As String, ByVal myProps As FileClass)

        ' creo un filestream  para guardar el archivo antes de que  se haya 'serializado con este metodo

        Dim fs As New FileStream(strPath, FileMode.OpenOrCreate)

        ' Establezco el formato en modo binario para poder guardarlo.

        Dim formatter As New BinaryFormatter

        Try

            ' Guardo los datos de la clase en el archivo especificado, para crear el contenedor

            formatter.Serialize(fs, myProps)
            fs.Close()

        Catch ex As SerializationException

            MessageBox.Show(ex.StackTrace, ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

    End Sub


    Friend Function Deserialize(ByVal strPath As String) As FileClass

        ' Creo un  filestream para poder abrir el archivo existente, que en este caso 
         'seria el archivo contenesor

        Dim fs As New FileStream(strPath, FileMode.Open)

        ' creo una instancia de la clase FileClass

        Dim myProps As FileClass
        myProps = New FileClass

        Try

            ' Estableco el formato en modo binario

            Dim formatter As New BinaryFormatter

            ' deserialize los datos almacenados en el archivo contenedor

            myProps = formatter.Deserialize(fs)
            fs.Close()

            'Retorno los datos y listo
            Return myProps

        Catch ex As SerializationException

            MessageBox.Show(ex.StackTrace, ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return myProps

        End Try

    End Function
End Module
Bueno espero que les sea util, ya que yo lo utilizo muy a menudo.