簡體   English   中英

使用 java nio 在 zip 中移動文件樹時出現 nosuchfileexception

[英]nosuchfileexception while walking files tree inside a zip using java nio

我在使用 java nio 遍歷 zip 文件的 VFS(虛擬文件系統)的文件樹時遇到異常,這是我的代碼:

public static void list(String zipFilePath) throws IOException{
    FileSystem fs = FileSystems.newFileSystem(Paths.get(zipFilePath), null);
    Path startPath = fs.getPath("/");

    Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            System.out.println("Dir : " + dir);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            System.out.println("\t->File : " + file);
            return FileVisitResult.CONTINUE;
        }
    });
}

異常表示文件不存在,但我已經解壓縮了存檔(zip),並且文件在那里......知道為什么嗎?

這是例外:

java.nio.file.NoSuchFileException: /Dir1/Dir2/Dir3/Dir4/ExcelFile.xlsm
at com.sun.nio.zipfs.ZipPath.getAttributes(ZipPath.java:657)
at com.sun.nio.zipfs.ZipFileSystemProvider.readAttributes(ZipFileSystemProvider.java:285)
at java.nio.file.Files.readAttributes(Files.java:1669)
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:105)
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:199)
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:69)
at java.nio.file.Files.walkFileTree(Files.java:2585)
at java.nio.file.Files.walkFileTree(Files.java:2618)

順便說一句:代碼確實有效,但它會因某些文件而崩潰

當您使用ZipFileSystem它會按照存儲路徑管理路徑(請記住,zip 中沒有文件夾,只有文件,並且每個文件都由其完整路徑名標識,直到所選目錄的級別壓縮,因此它在 zip 中不是“myTextFile.txt”,它被命名為“/Folder 1/Folder 2/myTextFile.txt”); 使用Path總是使用“標准”文件分隔符 (*nix OS) 返回名稱,但是如果您的 zip 存檔是使用 Windows 文件分隔符存儲的,它就會失敗,如果您使用相同的方法創建文件,則不會發生這種情況你將用來打開的,我的意思是,如果你使用ZipOutputStreamZipEntry來壓縮你的文件,然后使用ZipFileSystem來解壓縮它,如果你不小心文件分隔符,它就會失敗。

現在,您可能會說,為什么在您的情況下它僅在 zip 中的某些文件時失敗,那么,當我使用導致此問題的軟件時,我正在使用ZipOutputStream ZipEntryPath壓縮文件,我“手動" 瀏覽文件樹,直到我到達一個文件,並添加一個 zip 條目,我正在使用Path然后將要保存的文件的名稱添加到String名稱中,通過連接它來添加分隔符 ( +"/"+ ) .

您可能會說“好吧,我明白您在說什么,但是,為什么當您使用第三方軟件解壓縮存檔時它會起作用?”,這很簡單,因為它們替換了所有可能的文件分隔符在每個文件名中查找以確保它們始終使用相同的文件分隔符,無論是“/”還是“\\”...

經驗教訓:不要混合東西!!! 使用一種方法來壓縮和解壓縮您的檔案,或者確保所有信息都存儲在相同的“名稱”下,確保您每次都使用完全相同的文件分隔符。

我知道這是一個舊帖子,但正是這發生在我身上。 我所有的 zipfiles 都是由第三方創建的,即 Microsoft Word。 我什至無法捕獲異常以找出 zip 中的哪個輸入文件導致 NoSuchFileException,因為 Java 編譯器說:

NoSuchFileException 無法解析為類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM