Autor
|
Tema: Comprimir carpeta? (Leído 9,361 veces)
|
chacKos
Desconectado
Mensajes: 62
|
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!
|
|
|
En línea
|
---] chacKos [---
|
|
|
[D4N93R]
Wiki
Desconectado
Mensajes: 1.646
My software never has bugs. Its just features!
|
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!
|
|
|
En línea
|
|
|
|
chacKos
Desconectado
Mensajes: 62
|
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?
|
|
« Última modificación: 7 Marzo 2010, 11:42 am por C-ChacK »
|
En línea
|
---] chacKos [---
|
|
|
[D4N93R]
Wiki
Desconectado
Mensajes: 1.646
My software never has bugs. Its just features!
|
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 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!
|
|
|
En línea
|
|
|
|
MANULOMM
Desconectado
Mensajes: 559
Erepublik.com
|
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
|
|
|
En línea
|
|
|
|
chacKos
Desconectado
Mensajes: 62
|
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!
|
|
|
En línea
|
---] chacKos [---
|
|
|
|
|
|