ファイルやディレクトリを表すPath
インスタンスがあるとします。では、そのファイルはファイル・システムに存在するのでしょうか。 ファイルの読取り、書込み、実行は可能でしょうか。
Path
クラスのメソッドは統語的であり、Path
インスタンスに対して動作します。 しかし、最終的にはファイル・システムにアクセスして、特定のPath
が実際に存在するのかしないのかを確認する必要があります。 これは、exists(Path, LinkOption...)
メソッドとnotExists(Path, LinkOption...)
メソッドを使用して行うことができます。 !Files.exists(path)
は、Files.notExists(path)
と同等ではないことに注意してください。 ファイルの存在チェックでは、結果は次の3つのいずれかとなります。
exists
とnotExists
の両方がfalse
を返す場合は、ファイルが存在するかどうかは判定できません。
必要に応じてプログラムがファイルにアクセスできるかをチェックするには、isReadable(Path)
、isWritable(Path)
、isExecutable(Path)
の各メソッドを使用できます。
次のコードでは、特定のファイルが存在するかどうかと、プログラムがそのファイルを実行できるかどうかがチェックされます。
Path file = ...; boolean isRegularExecutableFile = Files.isRegularFile(file) & Files.isReadable(file) & Files.isExecutable(file);
TOCTTOU
を検索してください(発音はトクトゥです)。
シンボリック・リンクを使用するファイル・システムでは、2つの異なるパスが同じファイルを指している可能性があります。 isSameFile(Path, Path)
メソッドは2つのパスを比較し、それらがファイル・システム上の同じファイルを指しているかどうかを判断します。 次のように使用します。
Path p1 = ...; Path p2 = ...; if (Files.isSameFile(p1, p2)) { //両方のパスが同じファイルを指している場合のロジック }