Java 7 NIO2 Files.walk NotDirectoryException

时间:2018-06-11 12:30:39

标签: java nio

我有一个SymbolicLink指向他的父目录,是的,这很奇怪,但我试图理解FileSystemLoopException我已经做到了。但另一个问题出现了。

我有以下代码。

var arr1 = [2,10,20,30,100];
var arr2 = [2,4,5,6,7,8,9];
var j = 0;
var i =0;
var newArray = [];

for(var x=0;x< (arr1.length + arr2.length);x++){
    if(arr1[i] >= arr2[j]){                //check if element arr2 is equal and less than arr1 element
        newArray.push(arr2[j]);
      j++;
    }else if(arr1[i] < arr2[j]){            //check if element arr1 index value  is less than arr2 element
        newArray.push(arr1[i]);
        i++;
    }
    else if(i == arr1.length || j < arr2.length){    // add remaining arr2 element
        newArray.push(arr2[j]);
        j++
    }else{                                                   // add remaining arr1 element
        newArray.push(arr1[i]); 
        i++
    }

}

console.log(newArray);

但抛出

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public final class FileLoopSystemException{
    private final Path target = Paths.get("C:\\Users\\Documents\\SymbolicLinks\\Folder\\SubDirectorio\\SymbolicApuntandoADirectorioLink.txt");
    public static void main(String[] args)throws Exception{
         final FileLoopSystemException clazz = new FileLoopSystemException();
         clazz.walk();
    }
    private void walk()throws Exception{
         System.out.println("Exist: "+Files.exists(target));//false
         System.out.println("Directory: "+Files.isDirectory(target));//true
         System.out.println("Symbolic: "+Files.isSymbolicLink(target));//true
         System.out.println("RegularFile: "+Files.isRegularFile(target));//false
         final long count = Files.walk(target,java.nio.file.FileVisitOption.FOLLOW_LINKS)
            .peek(a->System.out.println(Files.isSymbolicLink(a)+" "+a))
            .count();
         System.out.println("count = " + count);
    }        
}    

我正在使用FollowLink选项,但我甚至不知道目标是什么,这是一个目录,为什么Files.walk说不是一个目录,如果我没有通过FOLLOW_LINK选项打印文件本身是好的,因为不是跟随。

在恢复中为什么Files.walk无法横向我的目标,这是一个目录并且正在跟随?

API说

Exception in thread "main" java.nio.file.NotDirectoryException: C:\Users\Documents\SymbolicLinks\Folder\SubDirectorio\SymbolicApuntandoADirectorioLink.txt

但它是一个目录,并且只是因为将它视为常规文件它将打印文件名而不是链接跟随并且目录已设置但Java不能识别为REGULAR目录?

我的文件系统就像。

Checked exception thrown when a file system operation, intended for a directory, fails because the file is not a directory.

1 个答案:

答案 0 :(得分:2)

很可能SymbolicApuntandoADirectorioLink.txt是父目录的file symbolic link,而不是directory symbolic link

cd c:\temp
mkdir dir1
cd dir1
mklink file.link ..
mklink /d dir.link ..
dir
...
11/06/2018  15:03    <SYMLINKD>     dir.link [..]
11/06/2018  15:02    <SYMLINK>      file.link [..]

运行file.lnk的代码失败并显示

Exist: false
Directory: true
Symbolic: true
RegularFile: false
Exception in thread "main" java.nio.file.NotDirectoryException: C:\temp\dir1\file.link    

运行dir.link的代码失败并显示

Exist: true
Directory: true
Symbolic: true
RegularFile: false
true C:\temp\dir1\dir.link
Exception in thread "main" java.io.UncheckedIOException: java.nio.file.FileSystemLoopException: C:\temp\dir1\dir.link\dir1\dir.link