2017-05-01 13 views
1

おはようございます、すべて 私は、シンボリックリンクが指しているファイルパスを調べる方法をJavaで見つけようとしています。 シンボリックリンクフォルダを監視し、ファイル名に基づいていくつかのものがシンボリックリンクファイルを削除するシステムを持っています。 私がする必要があるのは、各シンボリックリンクファイルが指し示している場所を把握することです。シンボリックリンクがあるときにそのファイルも削除できます。 これはJavaを使用しています これはRHELシステム上にあります。JAVAシンボリックリンクが指し示すターゲットファイルパスを見つける方法は?

APIトピックへのガイダンスをいただければ幸いです。私は自分の検索で壁にぶつかっている。

答えて

3

https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html#toRealPath-java.nio.file.LinkOption...-

パスtoRealPath(LinkOption ...オプション) はにIOExceptionが既存のファイルの実際のパスを返します。このメソッドの正確な定義は実装に依存しますが、 一般に、このパスからは という絶対パスがこのパスと同じファイルを派生しますが、ディレクトリとファイルの実際の名前は となります。たとえば、ファイルシステム上の ファイル名の比較で大文字と小文字を区別しない場合、 という名前の要素は、実際の場合の名前を表します。さらに、 結果のパスには冗長な名前要素が削除されています。

このパスが相対パスである場合は、toAbsolutePathメソッドを呼び出すことによって、絶対パスが最初に取得されます( )。

オプション配列を使用して、シンボリックリンクの処理方法を にすることができます。デフォルトでは、シンボリックリンクは最終ターゲットの に解決されます。オプションNOFOLLOW_LINKSが存在する場合、このメソッドは シンボリックリンクを解決しません。いくつかの実装では、 ".."のような特別な名前 は、親ディレクトリを参照することができます。実際の パスを派生し、 ".."(または同等のもの)の前に非 ".."という名前がある場合、実装では一般的に両方の名前が削除されます。 がシンボリックリンクを解決しておらず、その前の名前がシンボリックリンクである場合 その結果、このパスと同じファイルが見つかる パスが保証される場合にのみ、名前が削除されます。

パラメータ: - オプション 扱わリターンはどのようにシンボリックリンクを示すオプション:絶対パスは、このオブジェクトによって配置されたファイル の実際のパスを表す例外:IOException - ファイルがない場合 が存在しないか、I/Oエラーではありませんが発生した場合SecurityException - デフォルトプロバイダの場合に、セキュリティマネージャがインストールされている場合、checkRead メソッドが呼び出されてファイルへの読み取りアクセスがチェックされ、この パスが絶対でない場合、checkPropertyAccessメソッドが呼び出されて checkシステムプロパティuser.dirへのアクセス

nioのtoRealPath()メソッドを使用します。 NO_FOLLOW_LINKS LinkOptionは、あなたがやろうとしていることの反対を行いますので、使用しないでください。これで

Path realPath = aFile.toPath().toRealPath() 

Path realPath = aPath().toRealPath() 

一つの落とし穴、それは実際に実際のパスを見つけるために、ファイルシステムと対話することがあるのでtoAbsolutePathとは異なり、toRealPathIOExceptionを投げる、ということです。

+0

素晴らしい詳細とAPIへのリンクですが、SecurityException例外もスローすることができます。これはまさに私が必要としていた情報でした。助けてくれてありがとう@Novaterata – Elijah

+0

しかし、IOExceptionがチェックされているので、インターフェイスを変更するか、try/catchを使う必要があります。 – Novaterata

2

java.nio.file.Files.readSymbolicLinkが必要な場合があります。

+0

ありがとう、インポートパス。 – Elijah

+0

は '/ usr/local/file'の相対パス、'/usr/local/link - >。/ file'を返すことに注意してください。次にFiles.readSymbolicLinkは 'file'と' Paths.get( "/ usr/local/files")。equals(Files.readSymbolicLink(Paths.get( "/ usr/local/link"))) 'を返します。この場合、私は 'Files.isSameFile(file、link)'を使用しました。また、リンクのターゲットファイルの絶対パスを取得するには、 'link.toRealPath()' – juanmf

関連する問題