Comprimir carpeta?

Iniciado por chacKos, 6 Marzo 2010, 14:55 PM

0 Miembros y 1 Visitante están viendo este tema.

chacKos

Hola, estoy intentando comprimir una carpeta. He mirado el código de msdn:
Module Module1
    Sub Main()
        ' Path to directory of files to compress.
        Dim dirpath As String = "c:\carpeta\"

        Dim di As DirectoryInfo = New DirectoryInfo(dirpath)


        ' Compress the directory's files.
        For Each fi As FileInfo In di.GetFiles()
            Compress(fi)
        Next

        ' Decompress all *.gz files in the directory.
        ' For Each fi As FileInfo In di.GetFiles("*.gz")
        'Decompress(fi)
        'Next

    End Sub

    ' Method to compress.
    Private Sub Compress(ByVal fi As FileInfo)
        ' Get the stream of the source file.
        Using inFile As FileStream = fi.OpenRead()
            ' Compressing:
            ' Prevent compressing hidden and already compressed files.

            If (File.GetAttributes(fi.FullName) And FileAttributes.Hidden) _
                <> FileAttributes.Hidden And fi.Extension <> ".gz" Then
                ' Create the compressed file.
                Using outFile As FileStream = File.Create(fi.FullName + ".gz")
                    Using Compress As GZipStream = New GZipStream(outFile, CompressionMode.Compress)
                        ' Copy the source file into the compression stream.
                        Dim buffer As Byte() = New Byte(4096) {}
                        Dim numRead As Integer
                        numRead = inFile.Read(buffer, 0, buffer.Length)
                        Do While numRead <> 0
                            Compress.Write(buffer, 0, numRead)
                            numRead = inFile.Read(buffer, 0, buffer.Length)
                        Loop

                        Console.WriteLine("Compressed {0} from {1} to {2} bytes.", _
                                          fi.Name, fi.Length.ToString(), outFile.Length.ToString())

                    End Using
                End Using
            End If
        End Using
    End Sub
    ' Method to decompress.
    Private Sub Decompress(ByVal fi As FileInfo)
        ' Get the stream of the source file.
        Using inFile As FileStream = fi.OpenRead()
            ' Get orignial file extension, for example "doc" from report.doc.gz.
            Dim curFile As String = fi.FullName
            Dim origName = curFile.Remove(curFile.Length - fi.Extension.Length)

            ' Create the decompressed file.
            Using outFile As FileStream = File.Create(origName)
                Using Decompress As GZipStream = New GZipStream(inFile, CompressionMode.Decompress)
                    ' Copy the compressed file into the decompression stream.
                    Dim buffer As Byte() = New Byte(4096) {}
                    Dim numRead As Integer
                    numRead = Decompress.Read(buffer, 0, buffer.Length)
                    Do While numRead <> 0
                        outFile.Write(buffer, 0, numRead)
                        numRead = Decompress.Read(buffer, 0, buffer.Length)
                    Loop
                    Console.WriteLine("Decompressed: {0}", fi.Name)

                End Using
            End Using
        End Using
    End Sub
End Module

Pero no se me ocurre como puedo para solo comprimir una carpeta, ya que este código comprime cada fichero de dentro del directorio por separado!


---] chacKos [---

[D4N93R]

Hasta el momento, que yo sepa, no existe una clase dentro del framework que pueda hacer esa tarea, por lo cual tienes que crear tu propia solicion para meter todos los archivos y carpetas dentro de un solo archivo.

Va algo así:

Comprimes un archivo, lees su contenido binario, y vas creando otro archivo con una estructura que sea capaz de entenderse de nuevo para ser "desarmada" y luego descomprimir cada archivo de nuevo.

No se si me di a entender. Es que tengo un poco de sueño! jeje

Saludos!

chacKos

#2
Ok, gracias, se me ocurrió tal vez con alguna dll del winrar o algo pero no se sí se podrá!

Estoy probando con la dll ionic.utils.zip.dll, funciona bien pero el problema es que el ejecutable tiene que estar en el mismo directorio que la dll, como puedo hacer para que la dll esté dentro del proyecto?


---] chacKos [---

[D4N93R]

Cita de: C-ChacK en  6 Marzo 2010, 17:33 PM
Estoy probando con la dll ionic.utils.zip.dll, funciona bien pero el problema es que el ejecutable tiene que estar en el mismo directorio que la dll, como puedo hacer para que la dll esté dentro del proyecto?

Bueno, crea un proyecto en .Net , e intenta hacerle referencia, en caso de que se pueda (COM), Visual Studio te va a ahorrar mucho trabajo con las llamadas y eso. Sino vas a tener que apuntar a mano :P

Sino, va a tener que estar registrada la libreria.

Yo creo que es mejor que te programes la solucion que te escribi en el post. Es más divertido!

Saludos!

MANULOMM

Te recomiendo mires la DLL de compresion de ICSharpCode es mas sencilla de usar y esta Hecha en .net, aunque ya miraste las opciones de compresion del framework?

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


chacKos

La cosa es que al usar una dll como lo hago yo queda junto con el .exe, y si dicha dll no está en el mismo directorio pues no funciona, la cosa es como hacer para que esté dentro del .exe! No sé supongo que habrá alguna forma de comprimir/empaquetar los archivos de un directorio en uno solo!


---] chacKos [---

[D4N93R]

Bajate estas 3 clases:
http://www.mediafire.com/?3yonwxo3dr2

http://www.mediafire.com/?n3qmuwdmmgn

http://www.mediafire.com/?dmitmmmxdzy


GZipResult result = GZip.Compress(sourceFolder,destFolder,fileName);

Con eso estas resuelto :D

Saludos!