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.