用Ant

2012-10-06 10 views
3

提取嵌套壓縮的檔案我需要處理它本身包含的ZIP檔案,所有遵循相同結構的zip壓縮包:用Ant

main.zip/ 
    foo-1.txt 
    foo-1.zip/ 
    ... 
    tests/ 
    ... 
    bar-1.txt 
    bar-1.zip/ 
    ... 
    tests/ 
    ... 
    bar-2.txt 
    bar-2.zip/ 
    ... 
    tests/ 
    ... 
    foobar-1.txt 
    foobar-1.zip/ 
    ... 
    tests/ 
    ... 

我想將txt文件和tests目錄提取到如下的結構這樣的:

foo/ 
    1/ 
    submission.txt 
    tests/ 
bar/ 
    1/ 
    submission.txt 
    tests/ 
    2/ 
    submission.txt 
    tests/ 
foobar/ 
    1/ 
    submission.txt 
    tests/ 

我設法目錄結構和文本文件到正確的地方:

<target name="extract submissions"> 
    <copy todir="${basedir}"> 
    <zipfileset refid="submissions.zip"/> 
<mapper type="regexp" from="(.*)-(.*)\.txt" to="\1/\2/\submission.txt"/> 
    </copy> 
</target> 

但現在我堅持如何訪問內部拉鍊內的測試目錄。我嘗試了一箇中間步驟,將內部拉鍊複製到測試目錄應該結束的地方。但是如何在不知道確切路徑的情況下訪問zip壓縮文件的內容?

回答

1

我終於找到了純的Ant溶液:

<target name="extract submissions"> 
    <copy todir="${basedir}"> 
    <zipfileset refid="submissions.zip"/> 
    <mapper type="regexp" from="(.*)-(.*)\.txt" to="\1/\2/\submission.txt"/> 
    </copy> 

    <subant genericantfile="${basedir}/build.xml" target="extract submission"> 
    <dirset dir="${basedir}" includes="*/*"/> 
    </subant> 
</target> 

<target name="extract submission"> 
    <copy todir="tests"> 
    <zipfileset refid="submission.zip"/> 
    <mapper type="regexp" from="tests/(.*)" to="\1"/> 
    </copy> 
</target> 

第一目標提取外zip文件,並調用每個提取的目錄中的第二個目標。這是由subant實現的。第二個目標然後解壓縮一個內部zip文件。由於它被應用在任何子目錄中,所有內部拉鍊都被提取。

0

看起來這是一個標準螞蟻任務不足的地方。所以您可以使用自定義任務或腳本解決方法。 Javascript最合適,因爲它不需要額外的依賴關係,jdk6就足夠了。通常只需要java編程知識。 Plus ant api,必須與ant manual一起下載。

以下示例查找當前目錄中的所有zip並將每個zip解壓縮到zip文件目錄中創建的tests目錄中。

<target name="un2"> 
    <fileset dir="." includes="**/*.zip" id="zipset" /> 
    <script language="javascript"> 
     it = project.getReference("zipset").iterator(); 
     while (it.hasNext()) { 
     zipFile = new java.io.File(it.next()); 
     java.lang.System.out.println(zipFile.getParent()); 
     unzipTask = project.createTask("unzip"); 
     unzipTask.setSrc(zipFile); 
     dest = new java.io.File(zipFile.getParent(), "tests") 
     unzipTask.setDest(dest); 
     unzipTask.execute(); 
     } 
    </script> 
    </target>