2009-02-18 13 views
6

Ich muss ein Zip-Archiv nach dem Filtern der Liste der Dateien erstellen, die ich aufnehmen möchte. Vorzugsweise möchte ich, dass das Modul sowohl unter Windows als auch unter Linux funktioniert.Wie kann ich ein Zip-Archiv in Perl erstellen?

Da ich die Liste der Dateien filtern muss, möchte ich nicht wirklich ein externes Programm verwenden. Ich würde lieber keine externen Abhängigkeiten einführen, also kann ich das Skript in eine einzige ausführbare Datei unter Windows kompilieren (mit ActiveState PDK).

Was ich bereits versucht

Bis jetzt habe ich Archive::Zip auf CPAN gefunden verwendet, aber es hat einen großen Fehler auf Windows-Rechner, die Nicht-ASCII-Dateinamen verwenden: die Dateinamen im Archiv, wie sie don wird beschädigt werde nicht in Unicode übersetzt.

Es gibt eine bug report filed dafür, aber es wurde nicht in über 10 Monaten aktualisiert und in der Modul-Dokumentation der Entwickler ist eher nicht hilfreich (der "reparieren Sie Ihren Computer oder loswerden von Windows" Art).

Update:
Dank der Erläuterungen von brian und Alan Haggai Alavi scheint es, dass genug Liebe in Archive::Zip setzen wird diese Fehler bald raus und haben schließlich ein voll funktionsfähiges Zip-Modul in Windows.

+0

Zip ist ein sehr altes Format und ich bin mir nicht ganz sicher, ob es Nicht-ANSI-Zeichen verarbeiten kann. Wenn die Zielsprache mindestens teilweise das lateinische Alphabet verwendet (dh nicht chinesisch), sollten Sie versuchen, die Dateinamen in ihren lateinischen Standardgegenstücken zu konvertieren. –

+0

Tatsächlich gab es Bestimmungen in der Spezifikation, um die utf8-Version des Dateinamens zu speichern. Sie können es in Anhang D von http://www.pkware.com/documents/casestudies/APPNOTE.TXT lesen –

+0

Haben Sie alle Abhängigkeiten von Archive :: Zip aktualisiert? –

Antwort

7

Der oben genannte Fehler wurde in letzter Zeit durch die Unterstützung von Unicode-Dateinamen unter Windows behoben. Eine Veröffentlichung mit dem Fix wird innerhalb einer Woche in CPAN verfügbar sein.

+0

Hallo Alan. Danke für das Update. Ich habe mir die Quelle für v1.27_01 angesehen, um zu sehen, ob ich es hacken kann, aber ich bin froh, dass bald eine offizielle Version verfügbar sein wird. Vielen Dank für Ihre Arbeit an diesem Modul. –

+0

Wenn Sie können, aktualisieren Sie bitte die FAQ, um den eher unpassenden Kommentar zu Windows zu entfernen. Diese Art von Sache hilft nicht und es tut Perl nicht gut, was für alle Betriebssysteme gilt. –

+0

Hallo Renaud, Vielen Dank für die Bemerkung. Ich werde sicher sein, die FAQ sowie den POD des Moduls zu aktualisieren. Grüße. –

1

Sie könnten die Standard-Verteilung Archive::Extract versuchen. Es ist möglicherweise nicht besser als Archive :: Zip, aber die Dokumentation besagt, dass es im Falle von Problemen unter die Haube geht, zu versuchen, die Befehlszeilentools auf Ihrem System zu verwenden, um die Datei zu entpacken. Dies ist wahrscheinlich am robustesten unter Unix, aber Windows hat ein Zip-Archiv-Dienstprogramm, und es sollte über die Befehlszeile zugänglich sein. Außerdem kann Archive :: Extract (theoretisch) mit vielen anderen Komprimierungstypen umgehen.

Natürlich kann Archive :: Extract einfach herausfinden, welche Art der Komprimierung die Datei verwendet, und sie dann an die entsprechende andere Bibliothek übergeben, die Archive :: Zip sein könnte.

Sie könnten auch versuchen IO::Uncompress::Unzip und es ist das Gegenstück, IO::Compress::Zip, nur zum Entpacken, Lesen und Reißen. Wenn unbedingt notwendig. Auch hier weiß ich nicht, wie viel besser diese funktionieren, aber sie sind alle Teil der Standardbibliothek.

+0

Archiv :: Extract ist nicht gut zum Erstellen von Dateien. –

+1

IO: Compress :: Zip bietet keine Werkzeuge zum Erstellen eines Archivs mit Dateien und Ordnern. Es wird verwendet, um Streams und einzelne Dateien zu komprimieren, ein bisschen wie gzip tut. –

10

Obwohl die Modul-Dokumentation einige dumme Dinge über Windows sagt, ist der aktuelle Betreuer Adam Kennedy, derselbe Typ, der dir Strawberry Perl gebracht hat. Er ist definitiv kein Anti-Windows. Er hat eine Version Oktober veröffentlicht, also arbeiten sie daran. Es gibt auch einen offenen Zuschuss von zu fix Archive::Extract bugs. Der Fehler, den Sie erwähnen, RT 35334: Filename Encoding by Archive::Zip, braucht vielleicht nur jemanden, der ihm etwas Liebe zeigt. Das könnten Sie sein. Die Leute lösen die Probleme, die sie stören, also braucht vielleicht niemand, der sich für das Modul interessiert, dies noch nicht.

Das Modul hatte Probleme, und ich habe seine Fortschritte verfolgt, seit ich es in ein paar Projekten verwende. Es ist in letzter Zeit viel besser geworden und kann sicherlich etwas Liebe gebrauchen. Manchmal bedeutet Open Source, dass die Probleme behoben werden, auf die Sie stoßen. Ich weiß, das hilft dir nicht, dein Problem sofort zu lösen, aber das ist, wie ich denke, dass du das neben system() Anrufe erledigen wirst.

+0

Danke für die Details Brian. Ich habe die Quelle bekommen und habe letzte Nacht durchgegangen, um zu sehen, ob ich etwas hacken könnte, um Unterstützung zu bekommen. Dann kam Alan Haggai Alavi vorbei, um zu bestätigen, dass dies bereits erledigt und bald verfügbar war, also warte ich ab. –

Verwandte Themen