ファイルかディレクトリかの判別

広告

前のページのサンプルで、ディレクトリに含まれるファイルとディレクトリの一覧を取得してみましたが、取得した一覧に含まれるものがファイルなのかディレクトリなのかが見た目では分かりません。そこで、ここではディレクトリとファイルの区別をする方法を見てみましょう。

まずは前のページのサンプルで使ったFileクラスで用意されている"list"メソッドについて見てみます。

この抽象パス名が示すディレクトリにあるファイルおよびディレクトリを示す文字列の配列を返しま
す。

この抽象パス名がディレクトリを示さない場合、このメソッドは null を返します。ディレクトリを
示す場合は、文字列の配列が返されます。文字列は、ディレクトリ内の各ファイルまたはディレクト
リごとに 1 つです。そのディレクトリ自体およびその親のディレクトリを示す名前は結果に含まれ
ません。各文字列は、絶対パスではなくファイル名です。

結果の配列の名前文字列は特定の順序にはなりません。アルファベット順になるわけではありません。

戻り値:
  この抽象パス名が示すディレクトリにあるファイルおよびディレクトリを示す文字列の配列。ディ
    レクトリが空の場合、配列は空になる。この抽象パス名がディレクトリを示さない場合、または
    入出力エラーが発生した場合は null 
例外: 
  SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの 
    SecurityManager.checkRead(java.lang.String) メソッドがディレクトリへの読み込みアクセス
    を許可しない場合

簡単に書くと、作成したFileクラスのオブジェクトに対してこの"list"メソッドを使った場合、Fileクラスオブジェクトの元になっているものがディレクトリだった場合は、そのディレクトリに含まれるファイル名の一覧を文字列型の配列にして返してくれます。

前のサンプルでは、CドライブのルートディレクトリからFileクラスのオブジェクトを作成しましたので、そのディレクトリに含まれるファイルとディレクトリの一覧を表す文字列の配列を取り出す事が出来ました。

今回は取り出したファイルとディレクトリの一覧を、ディレクトリなのかファイルなのかを判別する必要があります。この判定するためのメソッドもFileクラスで用意されているのですが、先ほどの"list"メソッドではファイルの一覧を名前だけ文字列で取得するので、この取り出した名前からまた1つ1つFileクラスのオブジェクトを作成し判定していかなければなりません。

そこで、今回はファイルやディレクトリの名前の一覧を取得するのではなく、ディレクトリに含まれるファイルやディレクトリをFileクラスのオブジェクトの一覧として取得できる"listFiles"メソッドを使ってみます。このメソッドもFileクラスで用意されています。

この抽象パス名が示すディレクトリ内のファイルを示す抽象パス名の配列を返します。

この抽象パス名がディレクトリを示さない場合、このメソッドは null を返します。ディレクトリを
示す場合、File オブジェクトの配列が返されます。File オブジェクトは、ディレクトリ内の各ファ
イルまたはディレクトリごとに 1 つです。ディレクトリ自体およびその親のディレクトリを示すパ
ス名は結果に含まれません。結果の各抽象パス名は、File(File, String)コンストラクタを使用する
ことにより、この抽象パス名から生成されます。そのため、このパス名が絶対の場合、結果の各パス
名は絶対です。このパス名が相対の場合、結果の各パス名は同じディレクトリに対して相対です。

結果の配列の名前文字列は特定の順序にはなりません。アルファベット順になるわけではありません。

戻り値:
  この抽象パス名が示すディレクトリ内のファイルおよびディレクトリを示す抽象パス名の配列。配
    列は、ディレクトリが空の場合は空になる。この抽象パス名がディレクトリを示さない場合、ま
    たは入出力エラーが発生した場合は null 
例外: 
  SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの 
    SecurityManager.checkRead(java.lang.String) メソッドがディレクトリへの読み込みアクセス
    を許可しない場合

このメソッドは基本的に"list"メソッドと同じなのですが、一覧をFileクラスのオブジェクトとして返してくれます。使い方は下記のようになります。

File directory = new File("c:¥¥");

File[] filelist = directory.listFiles();

これであるディレクトリに含まれるファイルとディレクトリの一覧を、Fileクラスのオブジェクトの配列として取得することが出来ました。

ファイルとディレクトリの判別

次に1つ1つのFileクラスのオブジェクトがファイルなのかディレクトリなのかを判別します。Fileクラスで用意されている"isFile"メソッドは、対象のFileクラスのオブジェクトがファイルだった場合にTrueを返してくるメソッドです。同じように"isDirectory"メソッドは対象のFileクラスのオブジェクトがディレクトリだった場合にTrueを返してくるメソッドです。

isFileメソッド:

この抽象パス名が示すファイルが普通のファイルかどうかを判定します。ファイルは、それがディレ
クトリではなく、システムに依存するほかの基準を満たす場合に「普通」のファイルと見なされま
す。Java アプリケーションが生成したディレクトリ以外のファイルは、必ず普通のファイルです。

戻り値:
  この抽象パス名が示すファイルが存在し、さらにそれが普通のファイルである場合は true、そう
    でない場合は false 
例外: 
  SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの 
    SecurityManager.checkRead(java.lang.String) メソッドがファイルへの読み込みアクセスを許
    可しない場合

isDirectoryメソッド:

この抽象パス名が示すファイルがディレクトリであるかどうかを判定します。

戻り値:
  この抽象パス名が示すファイルが存在し、さらにそれがディレクトリで
    ある場合は true、そうでない場合は false 
例外: 
  SecurityException - セキュリティマネージャが存在し、セキュリティ
    マネージャの SecurityManager.checkRead(java.lang.String) メソッド
    がファイルへの読み込みアクセスを許可しない場合

このメソッドを使って判別していきます。具体的には下記のようになります。

File directory = new File("c:¥¥");

File[] filelist = directory.listFiles();
for (int i = 0 ; i < filelist.length ; i++){
  if (filelist[i].isFile()){
    // ファイルだった時の処理
  }else if (filelist[i].isDirectory()){
    // ディレクトリだった時の処理
  }
}

また前のサンプルとは違ってファイル名やディレクトリの一覧を文字列としてではなくFileクラスのオブジェクトの配列として取得しているので、ファイル名又はディレクトリ名を画面に表示するときにはFileクラスで用意されている"getName"メソッドを使ってFileクラスのオブジェクトからファイル名又はディレクトリ名を取り出して表示します。

この抽象パス名が示すファイルまたはディレクトリの名前を返します。これは、パス名の名前シーケ
ンスの最後の名前です。パス名の名前シーケンスが空の場合、空の文字列が返されます。

戻り値:
  この抽象パス名が示すファイルまたはディレクトリの名前。このパス名の名前シーケンスが空の場
    合は空の文字列

サンプルプログラム

では試してみます。

fileTest2.java

import java.io.File;

class fileTest2{
  public static void main(String args[]){
    File cdirectory = new File("c:¥¥");

    File filelist[] = cdirectory.listFiles();
    for (int i = 0 ; i < filelist.length ; i++){
      if (filelist[i].isFile()){
        System.out.println("[F]" + filelist[i].getName());
      }else if (filelist[i].isDirectory()){
        System.out.println("[D]" + filelist[i].getName());
      }else{
        System.out.println("[?]" + filelist[i].getName());
      }
    }
  }
}

上記をコンパイルして実際に実行してみると下記のようになります。

p3

今回はファイルだったら先頭に[F]を、ディレクトリだったら先頭に[D]を付けて表示させてみました。どちらにも該当しないものは[?]を付けてあります。

( Written by Tatsuo Ikura )