2016-05-31 3 views
1

Ich brauche eine Liste von Dateinamen in einer ZIP-Datei mit Apache Ant Aufgabe, ohne es zuerst zu entpacken. Es sollte auch sein, unabhängig vom Betriebssystem, z.B .: wenn My.zip enthält:Wie bekomme ich eine Liste von Dateien in ZIP via Apache Ant Aufgabe?

dir1/path/to/file1.html 
dir1/path/to/file2.jpg 
dir1/another/path/file3.txt 
dir2/some/path/to/file4.png 
dir2/file5.doc 

Die Ant-Task die Liste oben mit dem relativen Pfad + Dateinamen zurückgeben sollte.

Antwort

1

Eine Lösung zipfileset und pathconvert, eingewickelt in macrodef zur Wiederverwendung mit:

<project> 

<macrodef name="listzipcontents"> 
<attribute name="file"/> 
<attribute name="outputproperty"/> 

<sequential> 
    <zipfileset src="@{file}" id="content"/> 
    <pathconvert property="@{outputproperty}" pathsep="${line.separator}"> 
    <zipfileset refid="content"/> 
    <map from="@{file}:" to=""/> 
    </pathconvert> 
</sequential> 
</macrodef> 

    <listzipcontents file="path/to/whatever.zip|war|jar|ear" outputproperty="foobar"/> 

    <echo>$${foobar} => ${foobar}</echo> 

</project> 

Vorteil: Sie alle nutzen können FileSet, F. E. Attribute include/exclude, wenn Sie zipfile contents filtern müssen - erweitern Sie einfach macodef mit zusätzlichen Attributen dafür, auch zipfileset unterstützt andere Archive wie jar, war, ear.

+0

Dies ist ein besserer Gesamtansatz. Später stellte ich jedoch fest, dass ich mehr Informationen aus dem ZIP-Dateiinhalt extrahieren musste, d. H. Letztes Datum der Änderung/Zeitstempel, Größe, Prüfsumme usw., und ich fühlte, dass das Scripting eine leichte Verfeinerung ermöglicht. Trotzdem möchte ich Ihre Antwort für meine ursprüngliche Frage akzeptieren. – Malvon

+0

@Malvon für Änderung/Timestamp/Größe können Sie Ant Addon Flaka nehmen und es mit Zipfileset ähnlich dem letzten Ausschnitt meiner Antwort hier verwenden => http://StackOverflow.com/A/21891513, auch Ant hat eine Prüfsummenaufgabe = > https://ant.apache.org/manual/Tasks/checksum.html; Wenn Sie Ant Flaka benutzen, nehmen Sie die letzte Version hier => https://github.com/greg2001/ant-flaka; – Rebse

+0

@ Malvon P. S. ein anderes Flaka-Beispiel hier => http://stackoverflow.com/a/5992436/130683, sonst wird es mit Script komplizierter, siehe hier => http://stackoverflow.com/a/14740667/130683 – Rebse

0

Hier ist eine etwas grausame Art und Weise davon durch script mit javascript Sprache in Ant tun:

<scriptdef name="getfilenamesfromzipfile" language="javascript"> 
    <attribute name="zipfile" /> 
    <attribute name="property" /> 
    <![CDATA[ 

      importClass(java.util.zip.ZipInputStream); 
      importClass(java.io.FileInputStream); 
      importClass(java.util.zip.ZipEntry); 
      importClass(java.lang.System); 

      file_name = attributes.get("zipfile"); 
      property_to_set = attributes.get("property"); 

      var stream = new ZipInputStream(new FileInputStream(file_name)); 

      try { 
       var entry; 
       var list; 
       while ((entry = stream.getNextEntry()) != null) { 
        if (!entry.isDirectory()) { 
        list = list + entry.toString() + "\n"; 
        } 
       } 

       project.setNewProperty(property_to_set, list); 

      } finally { 
       stream.close(); 
      } 

    ]]> 

</scriptdef> 

die dann in einem <target> aufgerufen werden kann:

<target name="testzipfile"> 

    <getfilenamesfromzipfile 
     zipfile="My.zip" 
     property="file.names.from.zip.file" /> 

    <echo>List of files: ${file.name.from.zip.file}.</echo> 

</target> 

Jede bessere Lösung ist willkommen.

Verwandte Themen