2013-12-13 50 views
1

我想用Groovy腳本將文件從一個位置複製到另一個位置。我發現拷貝後複製的文件比原始文件大幾個數量級。 經過一些試驗和錯誤,我找到了正確的方法來複制,但我仍然困惑,爲什麼它應該更大。複製後文件大得多。字節

def existingFile = new File("/x/y/x.zip") 
def newFile1 = new File("/x/y/y.zip") 
def newFile2 = new File("/x/y/z.zip") 

new File(newFile1) << new File(existingFile).bytes 
new File(newFile2).bytes = new File(existingFile).bytes 

如果你運行這段代碼,newFile1會比existingFile大得多,而newFile2將是大小existingFile相同。 請注意,這兩個zip文件之後都是有效的。

有誰知道爲什麼會發生這種情況?我是否錯誤地使用了第一個副本?或者在我的設置中有點奇怪?

+4

運行此代碼之前,y.zip是否已經存在? '''方法將指定的字節加到文件末尾,而'x.bytes = y'將覆蓋文件。而且由於ZIP格式可以容忍壓縮文件前面的垃圾(以允許自解壓縮存根等),因此您將ZIP數據附加到的任何文件都將成爲有效的壓縮文件。 –

+0

謝謝伊恩!這似乎是問題。我的代碼中存在一個循環多次的錯誤,一遍又一遍地複製文件。因爲我使用<<運算符,所以它一遍又一遍地附加到文件中。 – rifboy

+0

很高興幫助,我已經重新發布我的評論作爲答案。 –

回答

1

如果文件已經存在,則稱爲此代碼之前,那麼你會從<<得到不同的行爲和.bytes = ...

file << byteArray 

byteArray的內容附加到文件的末尾,而

file.bytes = byteArray 

覆蓋使用指定的內容的文件。當byteArray是ZIP數據時,兩個版本都會給你一個有效的ZIP文件的結果,因爲ZIP格式可以處理任意數據pre在實際的ZIP數據之前掛載到文件的開頭而不會使文件無效(通常這是用於像自解壓.exe存根)的東西。