2017-11-30 1 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ファイルをファイルにコピーする

私の全体方法:

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

は、ファイルを変更してみてください。ちょうど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()); 

、あなたは:

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

はそれを行うのは、よりポータブルです:

sourceFolder.resolve(file) 

(たとえば、あなたが実行した場合将来のLinux上のアプリケーションでは、 "\"は機能しません)。

また、マップをより簡潔にこの:

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

UPDATE:あなたの更新されたコードと下のコメントに続いて

、私はどこに補正しながら、可能な限り既存のコードの多くを再利用し、以下に示す作業メインクラスを作成しました必要。既存のzipファイルに対してもnewFileSystem()を使用する必要があることに注意してください。 getFileSystem()呼び出しでは、ファイルシステムプロバイダによってキャッシュされたコードの別の場所にすでにFileSystemオブジェクトが作成されており、FileSystems.getFileSystem()は既に存在するオブジェクトへの参照を返しているものとします。また、FileSystemはCloseableであるため、try-with-resourcesステートメントで使用してください。

完全に動作する完全なクラス、:/ D:ファイルへ/test.zip:// D://test.zip

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 is not hierarchical'をスローします。ファイルがすでに存在するかどうか、または新しいファイルが必要かどうかを確認するには、目的地のファイルが必要です。 – XtremeBaumer

+0

@XtremeBaumerこれは問題ではありません。このエラーはどこで得られますか?あなたが 'Files.exists(uri)'を呼ぶ時でしょうか? Files.existsにuriを渡すべきではありません。ちょうどパスを渡す(瓶なし:前に)。 – DodgyCodeException

+0

さて、存在しない場合は新しいzipファイルを適切に作成しますが、既存のzipファイルも開く必要があります。それを試してみると、 'FileSystemNotFoundException'が' fs = FileSystems.getFileSystem(uri); 'にスローされます。私のコピーも何もしません。 (更新されたコード) – XtremeBaumer

関連する問題