2012-02-15 1 views
4

가능한 중복 :
Appending files to a zip file with Java자바 우편에 파일을 추가

나는이 거기에 몇 가지 폴더를 포함하지만, 중요한 하나의 디렉토리이며, 그 안에 다른 폴더 우편 소위 폴더와 폴더에는 업데이트 할 수있는 많은 파일이 들어 있습니다.

나는 지금 dir이라는 지퍼 밖에있는 dir을 가지고 있으며, 경로가 동일하도록 업데이트 할 파일이있는 폴더입니다. 파일을 Zip으로 어떻게 업데이트 할 수 있습니까?

까다로운 부분은 dir이 zip의 루트에 있고 폴더가 아닌 많은 폴더가 포함되어 있지만 폴더의 파일 만 업데이트해야한다는 것입니다. 폴더에 있지만 여전히 dir에 있습니다.

이 작업을 수행 할 수 있습니까? 이것이 bash에서 -u 수정자를 사용하여 수행 할 수 있음을 알고 있지만 가능한 경우 java로이를 수행하는 것을 선호합니다.

그냥 수 있도록이 문제에 어떤 도움을 주셔서 감사합니다 우편 외부 명확

내부 우편 /디렉토리/폴더/filestoupdate에게

/디렉토리/폴더/filestomoveintozip

+0

HTTP에 나와 어떻게 아니다으로 : // 유래.com/questions/2223434/appending-files-to-a-zip-file-with-java –

답변

8

괜찮 았어 여기 최종 메서드는 내가 실제로 pasteoverned 링크를 @ Qwe 전에 게시 된 stackoverflow 주제에서 가져 왔어하지만 난 지퍼 내부의 폴더에 파일을 추가 할 수 있도록 경로 변수를 추가했습니다

좋아 그래서 지금 내가이

private void addFilesToZip(File source, File[] files, String path){ 
    try{ 
     File tmpZip = File.createTempFile(source.getName(), null); 
     tmpZip.delete(); 
     if(!source.renameTo(tmpZip)){ 
      throw new Exception("Could not make temp file (" + source.getName() + ")"); 
     } 
     byte[] buffer = new byte[4096]; 
     ZipInputStream zin = new ZipInputStream(new FileInputStream(tmpZip)); 
     ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source)); 
     for(int i = 0; i < files.length; i++){ 
      InputStream in = new FileInputStream(files[i]); 
      out.putNextEntry(new ZipEntry(path + files[i].getName())); 
      for(int read = in.read(buffer); read > -1; read = in.read(buffer)){ 
       out.write(buffer, 0, read); 
      } 
      out.closeEntry(); 
      in.close(); 
     } 
     for(ZipEntry ze = zin.getNextEntry(); ze != null; ze = zin.getNextEntry()){ 
      if(!zipEntryMatch(ze.getName(), files, path)){ 
       out.putNextEntry(ze); 
       for(int read = zin.read(buffer); read > -1; read = zin.read(buffer)){ 
        out.write(buffer, 0, read); 
       } 
       out.closeEntry(); 
      } 
     } 
     out.close(); 
     tmpZip.delete(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

private boolean zipEntryMatch(String zeName, File[] files, String path){ 
    for(int i = 0; i < files.length; i++){ 
     if((path + files[i].getName()).equals(zeName)){ 
      return true; 
     } 
    } 
    return false; 
} 
같은 질문에

감사에 대한 내 설정을 사용하여이 작업을 수행하는 것이 다른 폴더 안에 있던 폴더에 파일을 추가하고 싶었 위의 내 예제를 사용하는 방법 링크가 그 방법을 조금 향상시킬 수있게되어 루트에없는 파일을 추가 할 수있게되었습니다. 행복한 캠프 :) 희망이 도움이 밖에 다른뿐만 아니라 사람

그것은 단지 우편에 추가 할 수 없습니다 그러나 또한 압축 내에서 파일을 업데이트 할 수 있도록 나는 방법에 좀 더 일 편집

사용하여/당신은 경로 (마지막 변수)를 시작하지 않을이

File[] files = {new File("/path/to/file/to/update/in")}; 
addFilesToZip(new File("/path/to/zip"), files, "folder/dir/"); 

같은 방법 즉이 우편 항목

+0

renameTo는 Windows에서 false를 반환합니다. 왜 그런가? –

2

불행히도 Java는 Zip 파일을 업데이트 할 수 없습니다. 향상 요청을 제출했습니다 14 years ago ;-)

임시 폴더에 압축을 풀고 파일을 추가 한 다음 다시 압축해야합니다.

+0

글쎄,이 방법은 이미 내가 나를 루트에 추가 할 수있게하지만, 정말 그것을 개선하기 위해 자바와 함께 충분하지 않지만 여기에 방법이 http://pastebin.com/APJWMwc3 – user577732

+0

우편 번호를 추출하고 그것을 재 포장 문제는 우편 번호는 그것에 서명을 가지고 그래서 난 정말 수 없을거야 내가 그것을 압축을 풀고 그것을 압축을 풀고 난 후에 그것을하기 위해 – user577732

+0

는 링크드 질문을 본다 - 그들은 TrueZip를 추천한다 - 아마 당신의 문제를 해결할 수 있었다? –