代码之家  ›  专栏  ›  技术社区  ›  guwac

使用Ant提取嵌套zip档案

  •  3
  • guwac  · 技术社区  · 13 年前

    我需要处理一个zip档案,它本身包含遵循相同结构的zip档案:

    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中的测试目录的困境。我尝试了一个中间步骤,将内部zip复制到测试目录应该结束的地方。但是,在不知道zip存档的确切路径的情况下,我如何访问其内容?

    2 回复  |  直到 13 年前
        1
  •  1
  •   guwac    13 年前

    我终于找到了一个纯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文件,并在每个提取的目录上调用第二个目标。这是通过一个分支实现的。然后,第二个目标解压缩一个内部zip文件。由于它应用在任何子目录中,所以所有内部zip都被提取出来。

        2
  •  0
  •   Jarekczek    13 年前

    看起来这是一个标准蚂蚁任务不足的地方。因此,您可以使用自定义任务或脚本解决方法。Javascript最适合,因为它不需要额外的依赖项,jdk6就足够了。而且通常只需要java编程知识。加上ant api,必须使用 ant manual

    以下示例查找当前目录中的所有zip,并将每个zip提取到 tests 在zip文件目录中创建的目录。

      <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>
    
    推荐文章