2009-02-18 7 views
6

Ho bisogno di creare un archivio Zip dopo aver filtrato l'elenco dei file che voglio includere. Preferibilmente il modulo dovrebbe funzionare sia in Windows che in Linux.Come posso creare un archivio Zip in Perl?

Dal momento che è necessario filtrare l'elenco dei file, non voglio veramente utilizzare un programma esterno. Preferisco non introdurre dipendenze esterne, così posso compilare lo script in un singolo file eseguibile su Windows (usando ActiveState PDK).

Quello che ho già provato

Fino ad ora ho usato Archive::Zip trovato su CPAN ma ha un importante bug su computer Windows che utilizzano nomi di file non-ASCII: i nomi dei file corrotti in archivio come don essere tradotto in unicode

C'è uno bug report filed per quello ma non è stato aggiornato in più di 10 mesi e nella documentazione del modulo lo sviluppatore è piuttosto scortese (del tipo "aggiusta il tuo computer o sbarazzati di Windows").

Aggiornamento:
Grazie ai chiarimenti da Brian e Alan Aggeo Alavi sembra che abbastanza amore viene messo in Archive::Zip per ottenere questi insetti fuori presto e, infine, hanno un modulo zip pienamente funzionante in Windows.

+0

Zip è un formato molto vecchio e non sono completamente sicuro che sia in grado di gestire caratteri non ANSI. Se la lingua che stai usando come target utilizza almeno parzialmente l'alfabeto latino (cioè non cinese), dovresti provare a convertire i nomi dei file nelle loro controparti latine standard. –

+0

In realtà ci sono state delle disposizioni nelle specifiche per memorizzare la versione utf8 del nome file. Puoi leggerlo nell'Appendice D di http://www.pkware.com/documents/casestudies/APPNOTE.TXT –

+0

Hai aggiornato tutte le dipendenze di Archive :: Zip? –

risposta

7

Il suddetto bug è stato risolto molto recentemente con l'aggiunta del supporto per il nome file Unicode in Windows. Una versione con la correzione sarà disponibile in CPAN entro una settimana.

+0

Ciao Alan. Grazie per l'aggiornamento. Stavo guardando la fonte della v1.27_01 per vedere se potevo hackerarlo, ma sono contento che presto sarà disponibile una versione più ufficiale. Grazie per il tuo lavoro su questo modulo. –

+0

Se possibile, aggiornare le domande frequenti per rimuovere il commento piuttosto sconveniente su Windows. Questo genere di cose non aiuta e danneggia il Perl che è indirizzato a tutti i sistemi operativi. –

+0

Hi Renaud, Grazie per l'osservazione. Sarò sicuro di aggiornare le domande frequenti e il POD del modulo. Saluti. –

1

Si potrebbe provare la distribuzione standard Archive::Extract. Potrebbe non essere migliore di Archive :: Zip, ma la documentazione dice che, se ci sono problemi, va sotto il cappuccio per provare a usare gli strumenti da riga di comando sul tuo sistema per decomprimere il file. Questo è probabilmente il più robusto su Unix, ma Windows ha un'utilità di archiviazione zip, e lo dovrebbe essere accessibile tramite la riga di comando. Inoltre, Archive :: Extract può gestire molti altri tipi di compressione (teoricamente).

Naturalmente, è possibile che Archive :: Extract calcoli semplicemente il tipo di compressione utilizzata dal file e poi lo trasferisca nell'altra libreria appropriata, che potrebbe essere Archive :: Zip.

Si potrebbe anche provare IO::Uncompress::Unzip e la sua controparte, IO::Compress::Zip, per solo decompressione, lettura e rezipping. Se assolutamente necessario. Ancora una volta, non so quanto funzionerà molto meglio, ma sono tutte le parti della libreria standard.

+0

Archive :: Extract non va bene per la creazione di file. –

+1

IO: Compress :: Zip non fornisce gli strumenti per la creazione di un archivio contenente file e cartelle. È usato per comprimere flussi e singoli file, un po 'come fa gzip. –

10

Sebbene la documentazione del modulo dica alcune cose stupide su Windows, l'attuale manutentore è Adam Kennedy, lo stesso che ti ha portato a Strawberry Perl. Non è sicuramente anti-Windows. Ha rilasciato una versione di ottobre, quindi ci stanno lavorando. C'è anche una sovvenzione aperta da The Perl Foundation a fix Archive::Extract bugs. Il bug che hai menzionato, RT 35334: Filename Encoding by Archive::Zip, forse ha solo bisogno di qualcuno che lo mostri un po 'd'amore. Potrebbe essere tu. Le persone risolvono i problemi che li infastidiscono, quindi forse nessuno interessato al modulo ha ancora bisogno di questo.

Il modulo ha avuto problemi e ho seguito i suoi progressi da quando lo uso in un paio di progetti. Ultimamente è migliorato molto e può certamente usare un po 'd'amore. A volte l'open source significa aiutare a risolvere i problemi che si incontrano. So che questo non ti aiuta a risolvere il tuo problema immediatamente, ma è così che penso che riuscirai a fare questo a parte le chiamate system().

+0

Grazie per i dettagli Brian. Ho avuto la fonte e l'ho esaminata la scorsa notte per vedere se potevo modificare qualcosa per ottenere il supporto di utf8. Poi Alan Haggai Alavi è passato per confermare che era già stato fatto e disponibile a breve, quindi aspetterò e vedrò. –