我需要使用Apache Ant任务获取ZIP文件中的文件名列表,而不首先解压缩它。它也应该是OS独立的,例如:如果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任务应该使用相对路径+ filename返回上面的列表。
答案 0 :(得分:1)
使用zipfileset和pathconvert的解决方案,包含在macrodef中以供重复使用:
<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>
优点:您可以使用所有文件集属性,例如。如果你需要过滤zipfilecontents包含/排除 - 只需使用其他属性扩展macrodef,zipfileset也支持其他档案,如jar,war,ear。
答案 1 :(得分:0)
在Ant中使用script
语言通过javascript
执行此操作有点残忍:
<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>
然后可以在<target>
中调用
<target name="testzipfile">
<getfilenamesfromzipfile
zipfile="My.zip"
property="file.names.from.zip.file" />
<echo>List of files: ${file.name.from.zip.file}.</echo>
</target>
欢迎任何更好的解决方案。