6

Windows64ビットでOracleJava7を使用しています。

Files.createSymbolicLinkを使用してシンボリックリンクを作成すると、次の動作に気付きます。

  1. ターゲットがディレクトリの場合、「ディレクトリシンボリックリンク」が作成されます。
  2. ターゲットがファイルの場合、「ファイルシンボリックリンク」が作成されます。
  3. ターゲットが存在しない場合は、「ファイルシンボリックリンク」が作成されます。

シンボリックリンクのタイプは固定されており、ターゲットへの変更に関係なく、変更されることはありません。

Windowsのネイティブmklinkコマンドを使用すると、リンクタイプを強制的に「ディレクトリシンボリックリンク」にすることができます。ネイティブJavaAPIまたはいくつかのライブラリを使用してこれを実現することは可能ですか?

些細で醜い方法の1つは次のとおりです。

  1. ターゲットがディレクトリの場合は、リンクを作成するだけです
  2. ターゲットが存在しない場合は、新しい空のターゲットディレクトリを作成し、リンクを作成して、ディレクトリを削除します。
  3. ターゲットがファイルの場合...それを処理します(移動し、#2を適用し、元に戻します)。

醜い。

4

1 に答える 1

3

残念ながら、Java API 内でそれを行う方法がわかりません。

Windows JRE コードを確認したところ、決定はファイル属性自体に基づいているようです。

try
{
   WindowsFileAttributes windowsfileattributes = WindowsFileAttributes.get(windowspath2, false);
   if(windowsfileattributes.isDirectory() || windowsfileattributes.isDirectoryLink())
      i |= 1;
}

属性自体はネイティブコードに由来するものであり、それらに影響を与える方法はないようです。

明らかに、次のようなものを使用して返されたオブジェクトを手動で呼び出しmklinkたり、操作したりするなどの他のオプションがありますPowerMock(これは明らかにこの目的のためのものではありません)。

もう 1 つの汚いオプションは、関連するすべてのクラスのプロキシを作成することです: PathFileSystemおよびFileSystemProvider
それが機能する方法は、 がPath返す aFileSystemを返すというFileSystemProviderことです - あなたがする必要があるのは、FileSystemProvider.createSymbolicLinkメソッドの動作を変更することです。

このcreateSymbolicLinkメソッドは、現在使用されていない varargs 引数を受け取ります-シンボリックリンクの作成方法をオーバーライドする必要があることをラッパーに示す引数を渡すことができます-そして、そこに行きます:)

これをすべて書いた後、私が持っている唯一の質問は、なぜこの種の動作が必要なのですか?

于 2012-10-03T11:57:26.700 に答える