如何通过ApacheAnt任务获取ZIP文件列表?

如何通过ApacheAnt任务获取ZIP文件列表?,apache,file,ant,zip,Apache,File,Ant,Zip,我需要使用ApacheAnt任务获取ZIP文件中的文件名列表,而无需先解压缩。它还应该独立于操作系统,例如:如果My.zip包含: dir1/path/to/file1.html dir1/path/to/file2.jpg dir1/another/path/file3.txt dir2/some/path/to/file4.png dir2/file5.doc Ant任务应该返回上面带有相对路径+文件名的列表。下面是一种使用Ant中的javascript语言通过script执行的有点残酷的

我需要使用ApacheAnt任务获取ZIP文件中的文件名列表,而无需先解压缩。它还应该独立于操作系统,例如:如果My.zip包含:

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

Ant任务应该返回上面带有相对路径+文件名的列表。

下面是一种使用Ant中的
javascript
语言通过
script
执行的有点残酷的方法:

<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>

然后可以在
中调用:


文件列表:${file.name.from.zip.file}。
欢迎使用任何更好的解决方案。

使用和的解决方案,包装为可重用:

<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>

$${foobar}=>${foobar}

优点:如果需要过滤ZipFileContent,您可以使用所有文件集属性,例如include/exclude-只需使用附加属性扩展macrodef即可,zipfileset还支持其他归档,如jar、war、ear。

这是一种更好的总体方法。然而,后来,我意识到我需要从zip文件内容中提取更多信息,即修改的最后日期/时间戳、大小、校验和等,我觉得脚本可以简化细化。尽管如此,我还是愿意接受您对我原始问题的回答。@Malvon对于修改/时间戳/大小,您可以使用Ant addon Flaka并将其与zipfileset一起使用,类似于我在此处回答的最后一个片段=>,Ant还有一个校验和任务=>;当使用Ant Flaka时,在这里取最后一个版本=>@Malvon P.S.这里是另一个Flaka示例=>,否则脚本会变得更复杂,请参见这里=>
<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>