java.nio.file.Files.walkFileTree:在空NTFS卷的根目录上引发NoSuchFileException

java.nio.file.Files.walkFileTree:在空NTFS卷的根目录上引发NoSuchFileException,java,file,directory,ntfs,Java,File,Directory,Ntfs,考虑以下Java方法: private void printContents(final Path start) throws Exception { System.out.println("Finding the contents of " + start); Files.walkFileTree(start, new SimpleFileVisitor<Path>() { @Override public FileVisitResult preV

考虑以下Java方法:

private void printContents(final Path start) throws Exception {
    System.out.println("Finding the contents of " + start);

    Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
        @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IllegalArgumentException {
            System.out.println("preVisitDirectory: " + dir);    // do this to indicate progress
            return FileVisitResult.CONTINUE;
        }

        @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IllegalArgumentException {
            System.out.println("visitFile: file = " + file);    // do this to indicate progress
            return FileVisitResult.CONTINUE;
        }

        @Override public FileVisitResult visitFileFailed(Path file, IOException ioe) throws IOException {
            System.out.println("visitFileFailed: file = " + file + ", ioe = " + ioe);   // do this to indicate progress
            throw ioe;
        }
    } );
}
private void printContents(最终路径开始)引发异常{
System.out.println(“查找“+start”的内容);
walkFileTree(开始,新的SimpleFileVisitor(){
@重写公共文件VisitResult preVisitDirectory(路径目录,基本文件属性属性属性)引发IllegalArgumentException{
System.out.println(“preVisitDirectory:+dir);//执行此操作以指示进度
返回FileVisitResult.CONTINUE;
}
@重写公共文件VisitResult visitFile(路径文件,基本文件属性属性)引发IllegalArgumentException{
System.out.println(“visitFile:file=“+file);//执行此操作以指示进度
返回FileVisitResult.CONTINUE;
}
@重写公共文件VisitResult visitFileFailed(路径文件,IOException ioe)引发IOException{
System.out.println(“visitFileFailed:file=“+file+”,ioe=“+ioe);//执行此操作以指示进度
扔ioe;
}
} );
}
它通常工作得很好,可以打印出目录内容,并且几乎可以为start指定任何值

但假设start arg实际上是NTFS卷的根目录(例如,类似“g:”的驱动器号),并假设该卷为空(即没有内容)。然后,printContents会抛出具有此堆栈跟踪的NoSuchFileException:

java.nio.file.NoSuchFileException: G:
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsDirectoryStream.<init>(WindowsDirectoryStream.java:86)
    at sun.nio.fs.WindowsFileSystemProvider.newDirectoryStream(WindowsFileSystemProvider.java:518)
    at java.nio.file.Files.newDirectoryStream(Files.java:457)
    at java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:300)
    at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:322)
    at java.nio.file.Files.walkFileTree(Files.java:2662)
    at java.nio.file.Files.walkFileTree(Files.java:2742)
    at FileTreeComparer.printContents(FileTreeComparer.java:457)
    ...
java.nio.file.NoSuchFileException:G:
位于sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
位于sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
位于sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
位于sun.nio.fs.WindowsDirectoryStream。(WindowsDirectoryStream.java:86)
位于sun.nio.fs.WindowsFileSystemProvider.newDirectoryStream(WindowsFileSystemProvider.java:518)
位于java.nio.file.Files.newDirectoryStream(Files.java:457)
在java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:300)
位于java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:322)
位于java.nio.file.Files.walkFileTree(Files.java:2662)
位于java.nio.file.Files.walkFileTree(Files.java:2742)
在FileTreeComparer.printContents(FileTreeComparer.java:457)
...
为什么会发生这种情况,有什么解决办法吗

我注意到,如果start arg是空FAT32卷的根目录,那么这不会导致任何问题

此外,如果start arg是NTFS卷(例如:\tmp)上根目录的某个子目录,则这也不会导致任何问题,无论它是否为空


不,这个问题似乎与空的NTFS根目录无关。

您是否尝试过传递“G:\”而不是“G:”?@Andrea:我应该在我的原始帖子中提到,我尝试过G:\和G://以及G:,但这并不重要:所有3个变体都以完全相同的方式失败。