ファイルやディレクトリを表す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)) {
//両方のパスが同じファイルを指している場合のロジック
}