2009-02-18 28 views
6

Necesito crear un archivo Zip después de filtrar la lista de archivos que quiero incluir. Preferiblemente, me gustaría que el módulo funcione tanto en Windows como en Linux.¿Cómo puedo crear un archivo Zip en Perl?

Como necesito filtrar la lista de archivos, realmente no quiero usar un programa externo. Prefiero no introducir dependencias externas tampoco, así que puedo compilar el script en un solo ejecutable en Windows (usando ActiveState PDK).

lo que ya probé

Hasta ahora he utilizado Archive::Zip encontrado en CPAN pero tiene un fallo importante en la máquina de Windows que utilizan nombres de archivo no ASCII: los nombres de archivo se corrompe en el archivo, ya que Don no se traduce a unicode

Hay un bug report filed para eso, pero no se ha actualizado en más de 10 meses y en la documentación del módulo el desarrollador es bastante inútil (del tipo "reparar su computadora o deshacerse de Windows").

Actualización:
Gracias a las aclaraciones de Brian y Alan Hageo Alavi parece que el amor lo suficientemente está siendo puesto en Archive::Zip para obtener estos insectos fuera pronto y, finalmente, tener un módulo de cremallera en pleno funcionamiento en Windows.

+0

Zip es un formato muy antiguo y no estoy del todo seguro de que pueda manejar caracteres que no sean ANSI. Si el idioma al que se dirige utiliza, al menos parcialmente, el alfabeto latino (es decir, no chino), debe intentar convertir los nombres de los archivos en sus homólogos latinos estándar. –

+0

En realidad, ha habido provisiones en la especificación para almacenar la versión utf8 del nombre del archivo. Puede leerlo en el Apéndice D de http://www.pkware.com/documents/casestudies/APPNOTE.TXT –

+0

¿Ha actualizado todas las dependencias de Archive :: Zip? –

Respuesta

7

El error mencionado anteriormente ha sido resuelto muy recientemente por la adición de soporte de nombre de archivo Unicode en Windows. Un lanzamiento con la solución estará disponible en CPAN dentro de una semana.

+0

Hola Alan. Gracias por la actualización. Estaba buscando en la fuente para v1.27_01 para ver si podía hackearlo, pero me alegro de que pronto esté disponible una versión más oficial. Gracias por su trabajo en este módulo. –

+0

Si puede, actualice las preguntas frecuentes para eliminar el comentario bastante impropio sobre Windows. Ese tipo de cosas no ayuda y perjudica a Perl, que está dirigido a todos los sistemas operativos. –

+0

Hola Renaud, Gracias por el comentario. Me aseguraré de actualizar las preguntas frecuentes y el POD del módulo. Saludos. –

1

Puede probar la distribución estándar Archive::Extract. Puede que no sea mejor que Archive :: Zip, pero la documentación dice que, si hay problemas, va por debajo del capó para tratar de usar herramientas de línea de comandos en su sistema para descomprimir el archivo. Esto es probablemente más robusto en Unix, pero Windows tiene una utilidad de archivo zip, y es si se puede acceder a a través de la línea de comando. Además, Archive :: Extract puede manejar muchos otros tipos de compresión (teóricamente).

Por supuesto, puede que Archive :: Extract simplemente descubra qué tipo de compresión utiliza el archivo y luego lo pasa a la otra biblioteca apropiada, que podría ser Archive :: Zip.

También puede probar IO::Uncompress::Unzip y su contraparte, IO::Compress::Zip, para simplemente descomprimir, leer y volver a descomprimir. Si es absolutamente necesario. De nuevo, no sé cuánto mejor funcionarán, pero son, todos parte de la biblioteca estándar.

+0

Archive :: Extract no sirve para crear archivos. –

+1

IO: Comprimir :: Zip no proporciona las herramientas para crear un archivo que contenga archivos y carpetas. Se utiliza para comprimir secuencias y archivos individuales, un poco como lo hace gzip. –

10

Aunque la documentación del módulo dice algunas cosas estúpidas sobre Windows, el mantenedor actual es Adam Kennedy, el mismo tipo que le trajo Strawberry Perl. Definitivamente no es anti-Windows. Lanzó una versión en octubre, por lo que están trabajando en ello. También hay una subvención abierta de The Perl Foundation a fix Archive::Extract bugs. El error que menciona, RT 35334: Filename Encoding by Archive::Zip, tal vez solo necesita que alguien le muestre algo de amor. Ese podrías ser tu. La gente resuelve los problemas que les molestan, por lo que tal vez nadie que esté interesado en el módulo lo necesite todavía.

El módulo ha tenido problemas, y he estado siguiendo su progreso ya que lo uso en un par de proyectos. Ha mejorado mucho recientemente y ciertamente puede usar un poco de amor. A veces, el código abierto significa ayudar a solucionar los problemas que encuentra. Sé que esto no te ayuda a resolver tu problema de inmediato, pero así es como creo que vas a hacer esto aparte de las llamadas system().

+0

Gracias por los detalles Brian. Obtuve la fuente y la estaba revisando anoche para ver si podía piratear algo para obtener soporte para utf8. Luego, Alan Haggai Alavi pasó por aquí para confirmar que esto ya estaba hecho y disponible pronto, así que esperaré y veré. –

Cuestiones relacionadas