2013-12-13 2 views
1

Groovy 스크립트를 사용하여 한 위치에서 다른 위치로 파일을 복사하려고합니다. 나는 복사 한 파일이 복사 한 후 원본 파일보다 큰 크기의 주문이라는 것을 발견했습니다. 몇 번의 시행 착오 끝에 나는 복사하는 올바른 방법을 찾았지만 더 커야하는 이유에 대해서는 의아해했습니다. 이 코드를 실행하면 newFile2existingFile와 같은 크기가됩니다 동안it.bytes로 복사 한 후 훨씬 더 큰 파일

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 

newFile1existingFile보다 훨씬 커집니다. 두 zip 파일 모두 유효합니다.

왜 이런 일이 발생하는지 알고 있습니까? 첫 번째 복사본을 잘못 사용하고 있습니까? 아니면 내 설정에서 이상한가?

+4

이 코드를 실행하기 전에 y.zip이 이미 존재합니까? '<< "접근법은 지정된 바이트를 파일 끝에 추가하는 반면,'x.bytes = y'는 파일을 덮어 쓸 것입니다. 그리고 ZIP 형식은 ZIP 파일의 앞에 가비지를 허용 할 수 있으므로 (자동 압축 풀기 스텁 등을 허용하기 위해) ZIP 데이터를 추가하는 모든 파일은 유효한 zip 파일이됩니다. –

+0

감사합니다 이안! 이것이 문제인 것 같습니다. 내 코드에 여러 번 반복되는 파일에 반복적으로 파일을 복사하는 버그가 있습니다. << 연산자를 사용했기 때문에 파일에 반복해서 추가하고있었습니다. – rifboy

+0

도움이 되니 기쁩니다. 내 의견을 답으로 다시 게시했습니다. –

답변

1

파일이 이미이 코드를 호출 해 전에 <<에서 다른 동작을 얻을 것이다 및 .bytes = ...

file << byteArray 

반면, 파일의 끝에 byteArray 내용을 추가합니다 존재하는 경우

은 지정된 내용이있는 파일을 덮어 씁니다. byteArray이 ZIP 데이터 일 경우 ZIP 형식은 파일을 무효화하지 않고 실제 ZIP 데이터 앞에 파일의 시작 부분에 보류 된 임의 데이터 을 처리 할 수 ​​있기 때문에 두 버전 모두 유효한 ZIP 파일입니다 (일반적으로 이것은 자동 압축 풀림 .exe 스텁 같은 것들에 사용됩니다.

관련 문제