フォルダのサイズを計算する


  1. 概要


    1. 目的

      Fileクラスを利用して、指定したディレクトリ(フォルダ)内部のファイルの名前とそのサイズを列挙します。ディレクトリ内部にディレクトリがある場合、再帰的にそのディレクトリの内部のファイルも表示します。

    2. Fileクラス
      Fileクラスはファイルの名前を変更する、ファイルを削除する、ファイルサイズを知る、ファイルの作成・変更日付を知る、などの他に、以下のようなディレクトリ関連の処理を行うことができます。
       ディレクトリを作成する
       ディレクトリの内部のファイルやディレクトリを知る
       パス名がディレクトリかファイル名かを知る。
      ファイルクラスはファイルパスから作成することができます。

    3. 手法:


      1. ファイルの列挙
        まず、指定したディレクトリ内部にあるすべてのファイルを列挙する手順を紹介します。
         ディレクトリの内部にはディレクトリが含まれるため、処理は再帰的になります。処理をしたいファイルパスに対し、add_files(f)で以下のような処理をします。
        fからFileクラスのインスタンスを作成します。
         File current_dir = new File(f, ".");
        この、current_dirに含まれるファイルやディレクトリのリストを作成します。
         String file_list[] = current_dir.list();
        file_list[i]の各要素に対し、Fileクラスのインスタンスを作成し、
         File current_file = new File(f, file_list[i]);
        current_file.isDirectory()で、ディレクトリか否かを調べます。
         ディレクトリなら、add_files(current_file);で再帰処理を行い、ファイルなら、その名前をリストflistに追加します。ファイルの絶対パスは
         current_dir.getAbsoluteFile()
        で、ファイル名のみは current_dir.getName()で取得できます。
        ファイルやディレクトリの取得順序は生成順なので、直下のファイルと下位のディレクトリに含まれるファイルが、交互に現れる場合もあります。
      2. add_file(File f){
        File current_dir = new File(f, ".");
        String file_list[] = current_dir.list();
        for (int i = 0; i < file_list.length; i++){
        if (current_file.isDirectory()){
        //再帰処理をする
        add_files(current_file);
        }
        else{
        flist.addItem(current_file.getAbsoluteFile());
        }
        }
    4. ファイルのサイズ


      ディレクトリ毎に含まれるファイルサイズを調べます。再帰処理をする場合のディレクトリのサイズはそのディレクトリに
        直接含まれるファイルのサイズ合計+直接含まれるディレクトリのサイズの合計
      となります。ここで、ディレクトリにレベル付けをします。直接指定されるディレクトリのレベルを0とし、そこに含まれるディレクトリのレベルを1とします。一般にレベルiに含まれるディレクトリのレベルをi+1とします。すると、レベルiのあるディレクトリdのサイズをsize[i]とし、dに含まれるファイルの合計をf[i]、dに含まれるレベルi+1のディレクトリのサイズの合計をsize(i+1)とすると、
       size[i]=f[i]+size[i+1]
      となります。レベル付けを行うと、特定のレベル以下のディレクトリのサイズのみを表示することができます。
    5. ファイルに割り当てられるディスクのサイズ


      ファイルのサイズは
       current_file.length()
      で取得できますが、これは、ファイルに必要なディスクのサイズではありません。ディスクサイズは最低の割り当てサイズがあり、これは、ファイルシステムにより異なります。この値は512バイト以下の小さなファイルのサイズをプロパティで確認すれば知ることができます。
      ここでは、このブロックサイズをテキストボックスから入手します。ファイルに必要なディスクのサイズはこの整数倍になります。したがって、1バイトのファイルでも、ディスク上のサイズは16kBになります。ただし、サイズ0のファイルはディスクの割り当てもないので例外処理が必要ですから、以下のように計算できます。
      if (current_file.length()!=0)//ディスクの割り当てサイズ
      dsksize=(current_file.length()/blockSize+1)*blockSize;
      else dsksize=0;
      1. ブロックサイズ
        ブロックサイズは、windowsの場合、NTFSで512、FAT、FAT32の場合、512-32kBになります。16kBのFATの場合1バイトのファイルでもディスク領域は16KBを使用します。
  2. プロジェクト


    1. ソース組み込み

      Jbuilderの標準アプリケーションでなく、fileSizeプロジェクトを生成し、そこにソースfile_Size.javaを組み込み方法でプロジェクトを生成します。

    2. クラス構成

      1. Application1クラス
        Frame1クラスを作成して呼び出します。

      2. レイアウト
        結果を表示するリスト、サイズを調べるディレクトリ、表示する最低レベル、ブロックサイズ、を指定するテキストボックス、処理を開始するgoボタンを配置します。


      3. 主要変数
        long size[]; 各レベルでのサイズを集計します。
        long dsize[]; 各レベルでのディスク上のサイズを集計します。
        long blockSize=512; ブロックサイズを記録します。

      4. go_actionPerformed(ActionEvent e)
        goボタンの処理で、指定ディレクトリのサイズの集計を開始します。

      5. add_files(f)
        ファイルfに含まれる要素のサイズを計算します。ディレクトリの場合、再帰的にadd_files()を呼び出します。指定以下のレベルのディレクトリをリストに書き出します。

    3. 実行

      アプレットでは動作しませんから、ダウンロードしclasesフォルダのdirsize.batファイルで実行して下さい(javaへのパスが登録してないと実行出来ません)。

  3. ダウンロード

    このプロジェクトをダウンロードできます。次の行をクリックして、dirsize.exeファイルを適当なフォルダに保存します。
    ダウンロード開始

    このファイルは自己解凍型の圧縮ファイルです。このファイルを実行すると指定したフォルダに必要なファイルが生成されます。

トップに戻る