このページを正しく表示するには、ブラウザでJavaScriptを有効にする必要があります。
コース: 重要なクラス
レッスン: 基本的なI/O
セクション: ファイルI/O(NIO.2を含む)
ファイルやディレクトリのチェック
ホームページ > 重要なクラス > 基本的なI/O

ファイルやディレクトリのチェック

ファイルやディレクトリを表すPathインスタンスがあるとします。では、そのファイルはファイル・システムに存在するのでしょうか。 ファイルの読取り、書込み、実行は可能でしょうか。

ファイルまたはディレクトリの存在チェック

Pathクラスのメソッドは統語的であり、Pathインスタンスに対して動作します。 しかし、最終的にはファイル・システムにアクセスして、特定のPathが実際に存在するのかしないのかを確認する必要があります。 これは、exists(Path, LinkOption...)メソッドとnotExists(Path, LinkOption...)メソッドを使用して行うことができます。 !Files.exists(path)は、Files.notExists(path)と同等ではないことに注意してください。 ファイルの存在チェックでは、結果は次の3つのいずれかとなります。 existsnotExistsの両方がfalseを返す場合は、ファイルが存在するかどうかは判定できません。

ファイルがアクセス可能かどうかのチェック

必要に応じてプログラムがファイルにアクセスできるかをチェックするには、isReadable(Path)isWritable(Path)isExecutable(Path)の各メソッドを使用できます。

次のコードでは、特定のファイルが存在するかどうかと、プログラムがそのファイルを実行できるかどうかがチェックされます。

Path file = ...;
boolean isRegularExecutableFile = Files.isRegularFile(file) &

                                  Files.isReadable(file) &

                                  Files.isExecutable(file);

注:これらのメソッドのいずれも、完了した後は、ファイルにアクセスできることが保証されるわけではありません。 多くのアプリケーションに見られるセキュリティ上の欠陥として、チェックを実行した後にファイルにアクセスすることがあります。 詳細については、お使いの検索エンジンでTOCTTOUを検索してください(発音はトクトゥです)。

2つのパスの示すファイルが同一かどうかのチェック

シンボリック・リンクを使用するファイル・システムでは、2つの異なるパスが同じファイルを指している可能性があります。 isSameFile(Path, Path)メソッドは2つのパスを比較し、それらがファイル・システム上の同じファイルを指しているかどうかを判断します。 次のように使用します。

Path p1 = ...;
Path p2 = ...;

if (Files.isSameFile(p1, p2)) {
    //両方のパスが同じファイルを指している場合のロジック
}

サンプル・プログラムで問題が発生した場合は、 『Compiling and Running the Examples: FAQs』を参照してください。
フィードバックをお寄せください。さまざまなご意見をお待ちしております。

前のページ: ファイル操作
次のページ: ファイルやディレクトリの削除