【问题标题】:Walking filetree throws error even tho the files should exist即使文件应该存在,行走文件树也会引发错误
【发布时间】:2017-12-06 23:02:27
【问题描述】:

我正在尝试浏览一个 zip 文件并打印出所有文件,但由于某种原因,它一进入任何子文件夹就会抛出一个 NoSuchFileException

    FileSystem fs = FileSystems.newFileSystem(Paths.get(folder.getRoot().getAbsolutePath(), "test.zip"), null);

    Files.walkFileTree(fs.getPath("/"), new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
            System.out.println(file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) {
            System.err.println(exc);
            return FileVisitResult.CONTINUE;
        }

    });

如果它们不存在,它怎么还想去那里?谁能帮我解决这个问题?这些文件实际上应该在那里,至少在手动执行测试时它们确实存在。

【问题讨论】:

    标签: java file filesystems java.nio.file


    【解决方案1】:

    在使用FileSystem 实现时要格外小心,因为它们特别依赖于您使用的JVM,在操作系统上!参照。 Javadoc of FileSystem

    一个很好的例子是 ZipFileSystem。它的娘家姓是com.sun.nio.zipfs.ZipFileSystem,但IBM JRE 在com.ibm.ws.install.ni.framework.io.ZIPFileSystem 中有自己的实现。此外,例如,由于存档的布局,您无法从 ZIP 文件访问内部 ZIP。您必须解压缩它,并将内部 ZIP 安装为另一个 FileSystem。 (之后当然要删除这些)

    当然还有this SO answer:您的期望可能是错误的。调试异常发生的确切位置并将其与您的期望相关联。

    【讨论】:

    • 我的期望是正确的。我的压缩输出显示文件已添加到 zip 但我无法访问它们
    【解决方案2】:

    如果我执行此代码,它只对我有用:

    import java.io.IOException;
    import java.nio.file.*;
    import java.nio.file.attribute.*;
    import java.util.zip.*;
    
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            try (ZipFile zipFile = new ZipFile("logs\\subfolder\\subsubfolder\\logs.zip")) {
                zipFile.stream()
                   .map(ZipEntry::getName)
                   .forEach(System.out::println);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
    
    
    
    //         Path fs = FileSystems.getDefault().getPath("logs", "");
    //
    //         System.out.println(fs.toAbsolutePath());
    //
    //         SimpleFileVisitor<Path> sfv = new SimpleFileVisitor<Path>() {
    //              @Override
    //              public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
    //                  System.out.println(file.toAbsolutePath());
    //                  return FileVisitResult.CONTINUE;
    //              }
    //
    //              @Override
    //              public FileVisitResult visitFileFailed(Path file, IOException exc) {
    //                  System.err.println(exc);
    //                  return FileVisitResult.CONTINUE;
    //              }
    //
    //          };
    //         
    //         try {
    //              Files.walkFileTree(fs, sfv);
    //         } catch (IOException e) {
    //             // TODO Auto-generated catch block
    //             e.printStackTrace();
    //         }
    
        }
    
    }
    

    这是eclipse中项目目录结构的图片:

    logs 目录中有一个名为 access.log 的文件。

    这是我的控制台输出:

    access.log
    Microsoft Access Database (neu).accdb
    Microsoft Excel-Arbeitsblatt (neu).xlsx
    test/Microsoft Access Database (neu).accdb
    test/Microsoft Excel-Arbeitsblatt (neu).xlsx
    

    Zip 及其子文件夹中的所有文件。

    List .zip directories without extracting

    【讨论】:

    • 嗯,它不在 zip 或任何其他存档中。一旦进入任何子文件夹,它就会抛出错误
    • 您是指 zip 文件的内容还是只是子文件夹?
    • 我想要我的 zip 中的文件列表以及 zip 中的子文件夹
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2020-10-25
    • 2016-01-04
    • 2018-08-14
    相关资源
    最近更新 更多