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:
La clase FileClass, es la que hace la magia, esta clase almacena las imagenes y ademas contiene 2 funciones addimagen y getimagen. 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
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:
Y por ultimo el Modulo, el cual contiene las funciones Serialize y Deserialize, el cual nos crearan los contenedores.<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
Serialize para crear el archivo contenedor y Deserializa para extraer los datos del Archivo contenedor
Código:
Bueno espero que les sea util, ya que yo lo utilizo muy a menudo. 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