java.nio.file.Files.walkFileTree:在空NTFS卷的根目录上引发NoSuchFileException
考虑以下Java方法: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
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个变体都以完全相同的方式失败。