Foros del Web » Programación para mayores de 30 ;) » .NET »

Comprimir los archivos de una carpeta por SEPARADO.

Estas en el tema de Comprimir los archivos de una carpeta por SEPARADO. en el foro de .NET en Foros del Web. Buenos días! Mi duda es como comprimir una carpeta con vb.net 2005, pero los archivos que esten dentro comprimirlos por separado. Por ejemplo si la ...
  #1 (permalink)  
Antiguo 12/06/2013, 07:38
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 3 meses
Puntos: 0
Pregunta Comprimir los archivos de una carpeta por SEPARADO.

Buenos días!
Mi duda es como comprimir una carpeta con vb.net 2005, pero los archivos que esten dentro comprimirlos por separado.
Por ejemplo si la carpeta tiene 5 documentos, sin importar si son imagenes, .txt, .doc, etc. que me cree 5 archivos .zip en la misma carpeta, 1 por cada documento.
Hasta el momento tengo el siguiente codigo:

Código vb:
Ver original
  1. Imports System.IO
  2. Imports System.IO.Directory
  3. Imports System.IO.DirectoryInfo
  4. Imports ionic.Zip
  5. Imports Ionic.BZip2
  6. Imports System.IO.Compression
  7.  
  8. Public Class Form1
  9.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  10.         Try
  11.  
  12.             With FolderBrowserDialog1
  13.                 .Reset()
  14.                 .Description = " Seleccionar una carpeta "
  15.                 .SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
  16.                 .ShowNewFolderButton = False
  17.                 Dim ret As DialogResult = .ShowDialog
  18.                 If ret = Windows.Forms.DialogResult.OK Then
  19.                     Dim nFiles As ObjectModel.ReadOnlyCollection(Of String)
  20.                     nFiles = My.Computer.FileSystem.GetFiles(.SelectedPath)
  21.                     TextBox1.Text = FolderBrowserDialog1.SelectedPath.ToString()
  22.                     MsgBox("Total de archivos: " & CStr(nFiles.Count), _
  23.                                             MsgBoxStyle.Information)
  24.                 End If
  25.                 .Dispose()
  26.             End With
  27.             Archivos()
  28.         Catch oe As Exception
  29.             MsgBox(oe.Message, MsgBoxStyle.Critical)
  30.         End Try
  31.     End Sub
  32.  
  33.     Public Sub Archivos()
  34.         Dim folder As New DirectoryInfo(Me.TextBox1.Text)
  35.  
  36.         For Each file As FileInfo In folder.GetFiles()
  37.             ListBox1.Items.Add(file.Name)
  38.            
  39.         Next
  40.     End Sub
  41.    
  42.  
  43.  
  44.     Public Sub Comprimir()
  45.         Dim txtFiles = Directory.GetFiles(Me.TextBox1.Text, "*", SearchOption.AllDirectories)
  46.         Dim FileN As String = ListBox1.Items.ToString
  47.         Using zip As ZipFile = New ZipFile()
  48.             For Each currentFile As String In txtFiles
  49.                 zip.AddFile(currentFile, "")
  50.                 zip.Save(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Me.TextBox1.Text), System.IO.Path.GetFileNameWithoutExtension(currentFile) + ".zip"))
  51.             Next
  52.         End Using
  53.     End Sub
  54.  
  55.     Private Sub Comprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  56.         If TextBox1.Text = "" Then
  57.             MessageBox.Show("Ingrese una carpeta")
  58.         Else
  59.             Comprimir()
  60.             MessageBox.Show("Carpeta comprimida")
  61.         End If
  62.  
  63.  
  64.     End Sub
  65. End Class

Como podran ver, el usuario selecciona la carpeta, esta ruta se pasa al Textbox1

PERO se queda trabado el programa al momento de comprimir la carpeta y solo me comprime 2 archivos, en el primer .zip viene un documento y en el segundo viene, el primer documento y el que le sigue y se queda paralizado el programa...

Me habia comentado mi jefe que en este pedazo podia ir comprimiendo uno por uno:

Código vb:
Ver original
  1. Public Sub Archivos()
  2.         Dim folder As New DirectoryInfo(Me.TextBox1.Text)
  3.  
  4.         For Each file As FileInfo In folder.GetFiles()
  5.             'ListBox1.Items.Add(file.Name)
  6.            'AQUI COMPRIMIR LOS ARCHIVOS
  7.        Next
  8.     End Sub

Pero no se como seria cualquier ayuda gracias!
  #2 (permalink)  
Antiguo 12/06/2013, 07:43
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Comprimir los archivos de una carpeta por SEPARADO.

Y no me guarda los archivos dentro de la carpeta seleccionada si no en la misma ruta que esta la carpeta por ejemplo:
C:\Mis Documentos\Prueba <--- la ruta de la carpeta y me los guarda los archivos
C:\Mis Documentos\Documentos.zip <--- en lugar de que venga dentro de la carpeta Prueba
  #3 (permalink)  
Antiguo 13/06/2013, 04:38
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Comprimir los archivos de una carpeta por SEPARADO.

Yo uso esta librería y la he adaptado un poco a mis necesidades:

http://dotnetzip.codeplex.com/
__________________
Aviso: No se resuelven dudas por MP!
  #4 (permalink)  
Antiguo 13/06/2013, 14:56
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Comprimir los archivos de una carpeta por SEPARADO.

Tienes varios fallos:

1º Creas el fichero zip fuera del bucle, por eso se te crea los siguientes zip con los ficheros anteriores.
2º Estás usando mal esto: System.IO.Path.GetDirectoryName(Me.TextBox1.Text. Esto devuelve el directorio de la ruta que le pases. Por tanto, si has seleccionado el directorio C:\Directorio\Prueba, te va a devolver C:\Directorio.

Te recomiendo además que uses el método EnumerateFiles, que es más eficiente. (Puedes leer porque buscando en Google).

Además, no indicas si quieres comprimir los ficheros en subdirectorios o sólo los que se encuentren en el directorio directamente. Si quieres en los subdirectorios sólo tienes que cambiar Directory.EnumerateFiles(Me.TextBox1.Text) por Directory.EnumerateFiles(Me.TextBox1.Text, "*", SearchOption.AllDirectories)

Código vb:
Ver original
  1. Public Sub Comprimir()
  2.         Dim txtFiles = Directory.EnumerateFiles(Me.TextBox1.Text)
  3.  
  4.         For Each currentFile As String In txtFiles
  5.             Using zip As ZipFile = New ZipFile()
  6.                 zip.AddFile(currentFile, "")
  7.                 zip.Save(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(currentFile), System.IO.Path.GetFileNameWithoutExtension(currentFile) + ".zip"))
  8.             End Using
  9.         Next
  10.     End Sub
  #5 (permalink)  
Antiguo 14/06/2013, 09:37
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Comprimir los archivos de una carpeta por SEPARADO.

No me aparece la opcion de EnumarateFiles.

Logre hacerlo de la siguiente forma:

Código vb:
Ver original
  1. Public Sub Comprimir()
  2.  
  3.         For Each archivo As String In My.Computer.FileSystem.GetFiles(Me.TextBox1.Text, "*", FileIO.SearchOption.SearchAllSubDirectories)
  4.             Using zip As ZipFile = New ZipFile()
  5.                 zip.AddFile(archivo, "")
  6.                 zip.Save(Path.Combine(Me.TextBox1.Text, Path.GetFileNameWithoutExtension(archivo) + ".zip"))
  7.             End Using
  8.         Next
  9.  
  10.     End Sub
Y me comprime de manera exitosa los archivos por separado.

Sin embargo, si la carpeta cuenta con subcarpetas quisiera preguntarle si desea comprimir las subcarpetas pero aun no encuentro la solucion...
Confirmo utilizo Vb 2005
  #6 (permalink)  
Antiguo 14/06/2013, 09:53
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Comprimir los archivos de una carpeta por SEPARADO.

Cita:
Iniciado por alexg88 Ver Mensaje
Tienes varios fallos:

1º Creas el fichero zip fuera del bucle, por eso se te crea los siguientes zip con los ficheros anteriores.
2º Estás usando mal esto: System.IO.Path.GetDirectoryName(Me.TextBox1.Text. Esto devuelve el directorio de la ruta que le pases. Por tanto, si has seleccionado el directorio C:\Directorio\Prueba, te va a devolver C:\Directorio.

Te recomiendo además que uses el método EnumerateFiles, que es más eficiente. (Puedes leer porque buscando en Google).

Además, no indicas si quieres comprimir los ficheros en subdirectorios o sólo los que se encuentren en el directorio directamente. Si quieres en los subdirectorios sólo tienes que cambiar Directory.EnumerateFiles(Me.TextBox1.Text) por Directory.EnumerateFiles(Me.TextBox1.Text, "*", SearchOption.AllDirectories)

Código vb:
Ver original
  1. Public Sub Comprimir()
  2.         Dim txtFiles = Directory.EnumerateFiles(Me.TextBox1.Text)
  3.  
  4.         For Each currentFile As String In txtFiles
  5.             Using zip As ZipFile = New ZipFile()
  6.                 zip.AddFile(currentFile, "")
  7.                 zip.Save(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(currentFile), System.IO.Path.GetFileNameWithoutExtension(currentFile) + ".zip"))
  8.             End Using
  9.         Next
  10.     End Sub
Disculpa muchas muchas gracias, me a servido mucho el codigo y probablemente sea la version del Visual ya que el mio es 2005, solo le modifique el EnumarateFiles por GetFiles ya que me marcaba error para comprimir los archivos de subcarpetas :D, gracias y buen fin de semana!! \♦/

Etiquetas: carpeta, comprimir, textbox, vb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:39.