2016-05-31 14 views
1

Apache Antタスクを使用してZIPファイルのファイル名のリストを最初に解凍することなく取得する必要があります。Apache Antタスク経由で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タスクは、相対パス+ファイル名で上記のリストを返す必要があります:それはまたMy.zipが含まれている場合:例えば、独立したOSである必要があります。

答えて

1

再利用のためmacrodefに包まれzipfilesetpathconvertを用いて、溶液、:

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

利点:あなたは、f.e.をすべてのファイルセットの属性を使用することができますzipfilecontentsをフィルタリングする必要がある場合はinclude/exclude - それに追加の属性を指定してマクロ定義を展開するだけでなく、zipfilesetはjar、war、earなどの他のアーカイブもサポートします。

+0

これは全体的に優れたアプローチです。しかし、後で、私はzipファイルの内容、つまり最終日の変更/タイムスタンプ、サイズ、チェックサムなどからより多くの情報を抽出する必要があることに気付き、スクリプティングで容易に洗練されると感じました。それにもかかわらず、私は私の元の質問に対するあなたの答えを受け入れたいと思います。 – Malvon

+0

修正/タイムスタンプ/サイズのための@MalvonあなたはAnt addon Flakaを受け取り、zipfilesetでそれを使用することができます。ここで私の答えの最後のスニペットと同じです。> http://stackoverflow.com/a/21891513、antにはチェックサムタスク= > https://ant.apache.org/manual/Tasks/checksum.html; Ant Flakaを使用している場合は、ここで最後のバージョンを取る=> https://github.com/greg2001/ant-flaka; – Rebse

+0

@Malvon P.S.もう一つのFlakaの例はこちら>> http://stackoverflow.com/a/5992436/130683、それ以外のスクリプトではもっと複雑になります。こちらをご覧くださいhttp://stackoverflow.com/a/14740667/130683 – Rebse

0

は、ここでのAntでjavascript言語でscriptを通してそれを行うための多少残酷な方法です。その後、<target>で呼び出すことができます

<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 name="testzipfile"> 

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

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

</target> 

任意のより良い解決策は大歓迎です。

関連する問題