15

ファイルがジャンクションであるかどうかを判断する方法を探し回っていますが、満足のいく答えは見つかりませんでした。

私が最初に試したのは:

Files.isSymbolicLink(aPath)

Windows でジャンクションと呼ばれるファイルではなく、シンボリック リンクのみを検出します。

ここで提案されている解決策も試してみました (JNA ライブラリを使用): Stackoverflow question (3249117) 、しかし、ジャンクションであることがわかっているファイルのいずれかで true を返すことはありませんでした。

どのファイルがジャンクションであるかを判断する唯一の方法は、Windows コマンド プロンプトで次のコマンドを実行することです。

DIR /S /A:L

私のコンピューターでは66個のフォルダーが返されますが、Files.isSymbolicLink(aPath)は2個しか返されませんでした。したがって、これを利用する方法を見つけることができると思いますが、ファイルツリーをトラバースするときはあまり効率的ではないと思います.

標準のJavaライブラリ、または代わりにJNAを使用してこれを行う方法はありますか?

4

5 に答える 5

7

JNA でネイティブ コードを記述できる場合は、Win32 APIGetFileAttributes()関数を直接呼び出してFILE_ATTRIBUTE_REPARSE_POINTフラグを確認できます (ジャンクションは再解析ポイントとして実装されます)。

更新: さまざまなタイプの再解析ポイントを区別するにReparseTagは、実際の再解析ポイントを取得する必要があります。分岐点の場合はIO_REPARSE_TAG_MOUNT_POINT(0xA0000003) に設定されます。

を取得するには、次の 2 つの方法がありますReparseTag

  1. 制御コードと共に使用DeviceIoControl()して、フィールドとして構造体を取得します。次の記事で、この手法を使用した実装例を確認できます。FSCTL_GET_REPARSE_POINTREPARSE_DATA_BUFFERReparseTagIsDirectoryJunction()

    NTFS ハード リンク、ディレクトリ ジャンクション、および Windows ショートカット

  2. FindFirstFile()構造体を取得するために使用しWIN32_FIND_DATAます。パスにFILE_ATTRIBUTE_REPARSE_POINT属性がある場合、dwReserved0フィールドにはReparseTag.

于 2012-12-05T22:19:33.743 に答える
5

Windows ではジャンクションの属性はisSymbolicLink()==ですがfalseisOther()==trueです。したがって、次のようなことができます。

boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows")
BasicFileAttributes attrs = Files.readAttributes(aPath, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
boolean isJunction = isWindows && attrs.isDirectory() && attrs.isOther();
于 2018-01-16T23:30:28.797 に答える