2016-10-03 41 views
1

我想解壓一個文件,但是如果存在某個文件,就不能替換它。沒有在Ant上覆蓋UNZIP

我嘗試這樣做:

<unzip src="compress.zip" dest="dirTo" overwrite="false"> 
<patternset> 
    <include name="dirFrom/**"/> 
</patternset> 

「dirFrom」,從目錄中的文件壓縮,我想提取什麼名字。我用「覆蓋」來僞造,但它不起作用,並且它會覆蓋。

我有一個目錄,這有不同的子目錄。我想要這些子目錄之一,它的文件和子目錄。

回答

1

我發現如何做到這一點。

1,我將所有內容提取到輔助目錄。 第二,我做了一個循環,比較文件,如果該文件存在。第三,如果文件不存在,我複製它。

<unzip src="compressFile.zip" dest="dirAux"> 
    <patternset> 
     <include name="mySubDir/**"/> 
    </patternset> 
</unzip> 

<fileset id="fileset1" dir="dirAux/mySubDir" /> 
<property name="newContentMySubDir" refid="fileset1"/> 

<for param="nameFile" list="${newContentMySubDir}" delimiter=";"> 
    <sequential> 

     <if> 
      <not><available file="${finalDir}/mySubDir/@{nameFile}" type="file"/></not> 
      <then> 
       <copy tofile="${finalDir}/mySubDir/@{nameFile}" file="dirAux/mySubDir/@{nameFile}"/> 
      </then> 
     </if> 

    </sequential> 
</for> 
+0

好的應該可以工作,但它使用ant-contrib庫。順便說一下,我認爲我的解決方案也能起作用,不是嗎? –

+0

對不起,這沒有爲我工作。我試過了,但沒有奏效。它覆蓋了一切。 –

+0

奇怪的是,我已經測試過,它適用於我...不錯,你找到了解決方法... –

0

overwrite設置爲false只會防止覆蓋目標文件,如果它比源文件更新。對於更復雜的過濾,您必須使用copy任務,因爲它在ant文檔中進行了說明(請參閱unzip任務 - 部分Related tasks)。對於爲例,下面的代碼,如果他們在目標目錄中已經存在不應該從一個zip文件中提取文件(尊重源目錄佈局):

<copy todir="${target.dir}"> 
    <zipfileset src="${zip.file}"> 
     <patternset> 
      <include name="**/*.*"/> 
     </patternset> 
     <present targetdir="${target.dir}" present="srconly"/> 
    </zipfileset> 
</copy> 
+0

謝謝,但它沒有工作。我將「

+0

是的,我的錯誤,你必須使用''src'屬性的zipfileset,我會修改我的例子。上面的例子只有在文件的結構與zip文件完全相同的情況下才有效:例如,如果文件'$ {target.dir} /文件不能寫入文件'META-INF/MANIFEST.MF' META-INF/MANIFEST.MF'存在。 –