2017-11-30 2 views
0

D:\test\ 폴더의 파일을 D:\test.zip에 복사하려면 어떻게합니까? java.nio.files.Files? 나는 NoSuchFileException: D:\Ausbildungsnachweise\Ausbildungsnachweis_Technisch_Form.doc -> D:\test.zip\Ausbildungsnachweis_Technisch_Form.doc을 예외로하고있다. 내가 올바른 pathes를 사용하고 있지만 패스가 존재하기 때문에 왜이 오류가 발생하는지 모르겠 생각합니다.Java 파일을 Zip 파일로 복사합니다.

내 전체 방법 :

Map<String, String> env = Collections.singletonMap("create", "true"); 
Path dir = Paths.get(destinationFolder.getAbsolutePath()); 
Path destination = dir.resolve(zipNameGenerator.getName() + fileEnding); 
URI uri = URI.create("jar:" + destination.toUri()); 

try { 
    FileSystem fs; 
    if (overwriteZipWithSameName || !Files.exists(destination)) { 
     fs = FileSystems.newFileSystem(uri, env); 
    } else { 
     fs = FileSystems.getFileSystem(uri); 
    } 
    for (String file : sourceFolder.list(filenameFilter)) { 
     Files.copy(sourceFolder.toPath().resolve(file), fs.getPath(file)); 
    } 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} 
+0

당신은 파일을 변경하려고 할 수 있습니다 :/D : /test.zip는 파일에 : // D : //test.zip. 그냥 2 센트 – Satya

+0

왜 ZipEntry를 사용하지 않습니까? –

+1

@DavidBrossard 개인 취향의 문제이지만 ZipEntry보다 Zip FileSystem을 사용하는 것이 더 쉽습니다. – DodgyCodeException

답변

2
URI uri = new URI("jar:file:/D:/test.zip"); 

아니, jar:file:///D:/test.zip해야합니다. 그러나 그 일의 대부분의 휴대용 방법은 다음과 같습니다

Path dir = Paths.get("D:\\"); 
Path file = dir.resolve("test.zip"); 
URI uri = URI.create("jar:" + file.toUri()); 

마찬가지로, 당신이 할 곳 :

sourceFolder.resolve(file) 

(예를 들어, 당신이 실행하는 경우 :

Paths.get(sourceFolder + "\\" + file) 

가 어떻게 더 휴대용입니다 미래의 Linux 응용 프로그램에서는 "\"가 작동하지 않습니다.)

또한 맵을보다 간결하게 만들 수 있습니다 이 :

Map<String, String> env = Collections.singletonMap("create", "true"); 

업데이트 : 업데이트 된 코드와 아래에 코멘트에 따라

, 내가 작업 메인 클래스는, 어디 수정하면서 가능한 한 기존 코드의 많은 재사용, 아래와 같이 만들었습니다 필요한. 기존 zip 파일에도 newFileSystem()을 사용해야합니다. getFileSystem() 호출은 파일 시스템 제공자가 캐시 한 코드의 다른 부분에 FileSystem 오브젝트를 이미 작성한 것으로 가정하고 FileSystems.getFileSystem()은 이미 존재하는 오브젝트에 대한 참조를 리턴합니다. 또한 FileSystem은 Closeable이므로 try-with-resources 문에서 사용하십시오. 완벽하게 작동

전체 클래스 :

import java.io.File; 
import java.io.FilenameFilter; 
import java.io.IOException; 
import java.net.URI; 
import java.nio.file.*; 
import java.util.Collections; 
import java.util.Map; 

public class SOQn47577298 { 
    private final static Map<String, String> CREATE_TRUE = 
      Collections.singletonMap("create", "true"); 

    interface ZipNameGenerator { 
     String getName(); 
    } 

    static void copyFileToZip(
      File sourceFolder, 
      FilenameFilter filenameFilter, 
      File destinationFolder, 
      ZipNameGenerator zipNameGenerator, 
      String fileEnding, 
      boolean overwriteZipWithSameName) throws IOException { 

     Path dir = Paths.get(destinationFolder.getAbsolutePath()); 
     Path destination = dir.resolve(zipNameGenerator.getName() + fileEnding); 
     URI uri = URI.create("jar:" + destination.toUri()); 

     final Map<String, String> env; 
     if (overwriteZipWithSameName || !Files.exists(destination)) { 
      env = CREATE_TRUE; 
     } else { 
      env = Collections.emptyMap(); 
     } 

     try (FileSystem fs = FileSystems.newFileSystem(uri, env)){ 
      for (String file : sourceFolder.list(filenameFilter)) { 
       Path source = sourceFolder.toPath().resolve(file); 
       Path dest = fs.getPath(file); 
       Files.copy(source, dest); 
      } 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     final File source = new File("D:\\Ausbildungsnachweise"); 
     final FilenameFilter nameFilter = (dir, name) -> name.endsWith(".doc"); 
     final File dest = new File("D:\\"); 
     final ZipNameGenerator zipNameGnr =() -> "test"; 
     final String fileEnding = ".zip"; 
     final boolean overwrite = false; 

     copyFileToZip(source, nameFilter, dest, zipNameGnr, fileEnding, overwrite); 
    } 
} 
+0

팁 주셔서 감사합니다. 정말로 감사드립니다. 슬프게도 나는'URI uri' 파일을 만들 수 없습니다. 그것은'IllegalArgumentException : URI가 계층 적이지 않습니다'를 던집니다. 파일이 이미 존재하는지 또는 새로운 파일이 필요한지 확인하려면 대상 파일이 필요합니다. – XtremeBaumer

+0

@XtremeBaumer는 문제가 아니어야합니다. 이 오류는 어디서 발생합니까? 'Files.exists (uri)'를 부를 때입니까? 당신은 Files.exists에 uri를 넘겨서는 안됩니다. 그냥 패스 (항아리없이 : 앞에). – DodgyCodeException

+0

좋아, 이제는 새로운 zip 파일이 없으면 제대로 생성되지만 기존 zip 파일도 열어야합니다. 그것을 시도하면,'FileSystemNotFoundException'을'fs = FileSystems.getFileSystem (uri);'에 던졌습니다. 또한 내 복사는 아무 것도하지 않습니다. (업데이트 된 코드) – XtremeBaumer

관련 문제