4

zip ファイル内のフォルダーに txt ファイルを追加しようとしています。最初に、zip ファイルのすべてのコンテンツを抽出してから、txt ファイルを追加してから圧縮して戻しました。次に、zipを解凍せずに変更できるnioメソッドについて読みました。この方法を使用すると、txt ファイルを zip のメイン フォルダーに追加できますが、それ以上はできません。

testing.zip ファイルには res フォルダーが含まれています。

これが私のコードです:

        Path txtFilePath = Paths.get("\\test\\prefs.txt");
        Path zipFilePath = Paths.get("\\test\\testing.zip");
        FileSystem fs;
        try {
            fs = FileSystems.newFileSystem(zipFilePath, null);
            Path fileInsideZipPath = fs.getPath("res/prefs.txt");  //when I remover "res/" code works.
            Files.copy(txtFilePath, fileInsideZipPath);
            fs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

次の例外が発生します。

java.nio.file.NoSuchFileException: res/
4

2 に答える 2

2

は確かに機能するはずであり、承認された回答fs.getPath("res/prefs.txt")にあるように分割する必要はありません。fs.getPath("res").resolve("prefs.txt")

例外java.nio.file.NoSuchFileException: res/はファイルに言及しているため、少し紛らわしいですが、実際にはディレクトリがありません。

私は同様の問題を抱えていましたが、私がしなければならなかったのは次のことだけでした:

if (fileInsideZipPath.getParent() != null)
   Files.createDirectories(fileInsideZipPath.getParent());

完全な例を参照してください:

@Test
public void testAddFileToArchive() throws Exception {
    Path fileToAdd1 = rootTestFolder.resolve("notes1.txt");
    addFileToArchive(archiveFile, "notes1.txt", fileToAdd1);

    Path fileToAdd2 = rootTestFolder.resolve("notes2.txt");
    addFileToArchive(archiveFile, "foo/bar/notes2.txt", fileToAdd2);

    . . . 
}


public void addFileToArchive(Path archiveFile, String pathInArchive, Path srcFile) throws Exception {        
    FileSystem fs = FileSystems.newFileSystem(archiveFile, null);
    Path fileInsideZipPath = fs.getPath(pathInArchive);
    if (fileInsideZipPath.getParent() != null) Files.createDirectories(fileInsideZipPath.getParent());
    Files.copy(srcFile, fileInsideZipPath, StandardCopyOption.REPLACE_EXISTING);
    fs.close();
}

ビットを削除Files.createDirectories()し、テストディレクトリをクリアしてクリアスタートを確保すると、次のようになります。

java.nio.file.NoSuchFileException: foo/bar/
at com.sun.nio.zipfs.ZipFileSystem.checkParents(ZipFileSystem.java:863)
at com.sun.nio.zipfs.ZipFileSystem.newOutputStream(ZipFileSystem.java:528)
at com.sun.nio.zipfs.ZipPath.newOutputStream(ZipPath.java:792)
at com.sun.nio.zipfs.ZipFileSystemProvider.newOutputStream(ZipFileSystemProvider.java:285)
at java.nio.file.Files.newOutputStream(Files.java:216)
at java.nio.file.Files.copy(Files.java:3016)
at java.nio.file.CopyMoveHelper.copyToForeignTarget(CopyMoveHelper.java:126)
at java.nio.file.Files.copy(Files.java:1277)
at my.home.test.zipfs.TestBasicOperations.addFileToArchive(TestBasicOperations.java:111)
at my.home.test.zipfs.TestBasicOperations.testAddFileToArchive(TestBasicOperations.java:51)
于 2015-10-18T21:24:49.683 に答える
2

(実際の答えを与えるために編集)

行う:

fs.getPath("res").resolve("prefs.txt")

それ以外の:

fs.getPath("res/prefs.txt")

メソッドは、.resolve()ファイル区切りなどに関して正しいことを行います。

于 2013-06-13T09:33:54.227 に答える