2012-12-05 2 views
11

필자는 파일이 교차점인지 여부를 결정할 방법을 찾고자 만족스러운 대답을 찾지 못했습니다. 내가 시도파일이 접합점인지 여부를 확인하십시오 (Windows의 경우)?

우선이었다 :

Files.isSymbolicLink(aPath) 

이없는 파일은 Windows의 접합이라에만 심볼 링크를 감지합니다.

또한 (JNA 라이브러리를 사용하여) 여기에 제안 된 솔루션을 시도 : Stackoverflow question (3249117) 를하지만, 내가 접합 것으로 알고있는 파일 중 하나에 진정한 반환하지 않습니다.

내가 분기점이되는 파일을 결정하기 위해 찾은 유일한 방법은 창에서 다음 명령을 실행 명령 프롬프트이다 : 그것은 66 개 폴더를 Files.isSymbolicLink (aPath가) 반환 wheras 반환 내 컴퓨터에서

DIR /S /A:L 

only 2. 그래서 이것을 활용하는 방법을 찾을 수 있다고 생각하지만, 파일 트리를 탐색 할 때 매우 효과적 일 것이라고는 생각하지 않습니다.

표준 Java 라이브러리 또는 JNA를 사용하여이를 수행 할 수있는 방법이 있습니까?

답변

4

JNA에서 원시 코드를 작성할 수있는 경우 Win32 API GetFileAttributes() 함수를 직접 호출하고 FILE_ATTRIBUTE_REPARSE_POINT 플래그 (junction은 재분석 지점으로 구현 됨)를 확인할 수 있습니다.

업데이트 : 여러 종류의 재분석 지점을 구별하려면 실제 재분석 지점 ReparseTag을 찾아야합니다. 연결 지점의 경우 IO_REPARSE_TAG_MOUNT_POINT (0xA0000003)으로 설정됩니다. REPARSE_DATA_BUFFER 구조체를 얻기 위해 FSCTL_GET_REPARSE_POINT 제어 코드와

  1. 사용 DeviceIoControl(), 이는 ReparseTag 필드로 :

    ReparseTag을 retreive하는 방법은 두 가지가 있습니다. 다음 문서에이 기술을 사용하여 IsDirectoryJunction() 구현의 예를 볼 수 있습니다

    NTFS Hard Links, Directory Junctions, and Windows Shortcuts

  2. 사용 FindFirstFile()WIN32_FIND_DATA 구조체를 얻을. 경로에 FILE_ATTRIBUTE_REPARSE_POINT 속성이 있으면 dwReserved0 필드에 ReparseTag이 포함됩니다.

+0

복사 & 붙여 넣기 코드를 제외하고는 JNA를 사용 해본 적이 없지만 제가 배우는 것이 더 좋은 방법이라고 생각하면됩니다. – Martin

+0

당신이 제안한 내용은 제가 게시 한 링크의 제안과 비슷하게 보입니다. 재 패자 깃발을 확인하는 방법에 대한 예제를 제공 할 수 있다면 크게 도움이 될 것입니다. – Martin

+0

'FILE_ATTRIBUTE_REPARSE_POINT'는'0x400'으로 정의되어 있으므로 링크 된 예제 코드는 특별히 FILE_ATTRIBUTE_REPARSE_POINT를 확인합니다. –

7

당신이 오라클의 JDK로 바로 자바,이 경우는 사기의 8, 그것은 ....

를 작업을 중단 할 수 있지만, JNA없이 할 수있는 방법이있을 수있다 당신 링크에 관련 BasicFileAttributes 인터페이스를 얻을 수 있습니다 :

BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS); 

는이 인터페이스의 구현 클래스 sun.nio.fs.WindowsFileAttributes 것을 발생할 수 있습니다. 그리고이 클래스는 메소드 isReparsePoint을 가지고 있는데, 이는 연결 지점과 심볼릭 링크 모두에 대해 true를 반환합니다.당신이 방법을 반사를 사용하려고하고 호출 할 수 있도록 : Files.isSymbolicLink(path)

하지, 그러나 재분석 지점입니다, 그 다음은 접합이의 경우 :

boolean isReparsePoint = false; 
    if (DosFileAttributes.class.isInstance(attr)) 
     try { 
      Method m = attr.getClass().getDeclaredMethod("isReparsePoint"); 
      m.setAccessible(true); 
      isReparsePoint = (boolean) m.invoke(attr); 
     } catch (Exception e) { 
      // just gave it a try 
     } 

지금 당신은 정말 심볼릭 링크인지를 발견 할 수 있습니다. Windows에서 J2SE 1.7 사용 자바 NIO

/** 
* returns true if the Path is a Windows Junction 
*/ 
private static boolean isJunction(Path p) { 
    boolean isJunction = false; 
    try { 
     isJunction = (p.compareTo(p.toRealPath()) != 0); 
    } catch (IOException e) { 
     e.printStackTrace(); // TODO: handleMeProperly 
    } 
    return isJunction; 
} 
+0

당신은 무엇을 교체 -1610612733의 값 (및 심볼릭 링크 -1610612724)을해야합니다 반사적'WindowsFileAttributes' 접합의'parseTag' 필드를 확인하여'Files.isSylmbolicLink (경로)'단계에 대한 필요성을 절약 할 수 있습니다 'try' 블록에 다음과 같이 입력하십시오 :'Field field = attr.getClass(). getDeclaredField ("reparseTag"); field.setAccessible (true); int parseTag = (int) field.get (attr); 부울 isJunction = parseTag == -1610612733; ' – Javaru

4

접합의 속성이 isSymbolicLink() == false을 가지고, 그것은 isOther() == true입니다. 따라서 다음과 같이 할 수 있습니다 :

BasicFileAttributes attrs = Files.readAttributes(aPath, BasicFileAttributes.class); 
boolean isJunction = isWindows && attrs.isDirectory() && attrs.isOther(); 
+0

그것은 작동하지 않는 것 같습니다. toRealPath()는 접합점의 경로 자체와 같습니다. –

+0

그것은 교차점에서 예상되는 것입니다. –

+0

이 코드는 작동하지 않습니다. 그렇습니까? p.compareTo (p.toRealPath()) 접합점은 동의 한대로 그리고 테스트에서 보았 듯이 0입니다. –

관련 문제