【Java】ディレクトリ作成ツール:定義ファイルパスと作成先を入力してディレクトリを作成する(サブディレクトリ含む)

■ツールの概要

ディレクトリを作成する際、通常では、「右クリック→新規フォルダ」やショートカットコマンド(windows:ctrl+shift+n、mac:cmd+shift+n)を使用して、ディレクトリを作成していく。

しかし、サブディレクトリ含む複数のディレクトリを作成する際、一つ一つ作成するのは、非常に時間を要する。

そこで、あらかじめ作成するディレクトリの階層を、テキストメモ(定義ファイル)として作成しておき、作成したい場所(出力ディレクトリ)を指定するだけで簡単にディレクトリを作成するツールを実装する。

以降、本ツールを「ディレクトリ作成ツール」と呼ぶ。

■画面仕様

「ディレクトリ作成ツール」の画面仕様を以下に示す。

  • 定義ファイル(フルパス)のテキストボックスにフルパスを入力する。
  • 出力ディレクトリ(フルパス)のテキストボックスにフルパスを入力する。
  • 「作成」ボタン押下時、出力ディレクトリの配下に、定義ファイルに記載したディレクトリパス(相対パス)をインプットにして、ディレクトリを作成する。

■入出力一覧

「ディレクトリ作成ツール」の入出力一覧を以下の表に示す。

項目名区分内容
定義ファイルパス入力定義ファイルを格納している絶対パス。
定義ファイル入力相対パスを記載したファイル。
出力ディレクトリパス入力ディレクトリを作成する場所の絶対パス。
出力ディレクトリ出力以下の①+②の名前で作成するディレクトリ。
①出力ディレクトリパス
②定義ファイルに記載した相対パス

・定義ファイル

定義ファイルに記入する内容は以下の通り。

  • 作成したいディレクトリ名を相対パス
  • サブディレクトリを含む場合は、「/」で区切る。

※本処理で使用するサンプルの定義ファイルを示す。

・path_data.txt

a/b/c
d/e
f
g/h/i/j
k/l
m/n/o/p/q/r
s/t/u
v/w/x/y
z

・出力ディレクトリ

定義ファイルに記載した名前で作成されたディレクトリ。

※作成したディレクトリ階層イメージ

■制約事項・前提条件

「ディレクトリ作成ツール」の制約事項および前提条件を以下に示す。

  • 動作(実行)環境はMacでのみ保証する。
    (※)windowsでは、ディレクトリ区切りが異なるため。

■プログラム設計

「ディレクトリ作成ツール」に使用する、各処理(クラス)の処理概要および処理フローを以下の表・図に示す。

・各処理の機能概要

処理/クラス名概要
メイン処理ディレクトリ作成ツールのメイン処理。
ディレクトリ作成画面を呼び出す。
ディレクトリ作成画面クラス以下の項目を入力する画面。
・定義ファイルパス
・出力ディレクトリパス
「作成」ボタン押下時、ディレクトリ作成クラスを呼ぶ。
ディレクトリ作成クラス定義ファイルの情報を1行ずつ読み込む(①)。
出力ディレクトリ配下に、
(①)の階層でディレクトリを作成する。
ディレクトリ作成DTOクラス以下のデータを保持する。
・定義ファイルパス
・出力ディレクトリパス
・処理完了メッセージ

・各処理の処理フロー

▼メインクラス

「ディレクトリ作成ツール」実行時のメイン処理。

▼ディレクトリ作成画面クラス

「定義ファイルパス」および「出力ディレクトリパス」を入力するためのGUI画面。
「作成」ボタン押下時、「ディレクトリ作成クラス」を呼び出す。

・プログラム処理フロー図

<コンストラクタ>


<「作成」ボタン押下時の処理>

▼ディレクトリ作成クラス

「ディレクトリ作成画面」にて入力した「定義ファイルパス」および「出力ディレクトリパス」をインプットに、ディレクトリを作成する。

・プログラム処理フロー図

<ディレクトリ作成処理>

▼ディレクトリ作成DTOクラス

「定義ファイルパス」、「出力ディレクトリパス」、「処理完了メッセージ」を格納・転送するクラス。

・フィールド一覧

論理名
定義ファイルパス(フルパス)String
出力ディレクトリパス(フルパス)String
処理完了メッセージString

■サンプルコード

・ディレクトリ構造

「ディレクトリ作成ツール」を構成するディレクトリ階層は、以下の通り。

make_dirs
├── bin // コンパイルしたクラスファイル格納先
│   ├── dto
│   │   └── PathInfoDTO.class
│   ├── fnc
│   │   └── MkdirsFnc.class
│   ├── gui
│   │   └── InputGui.class
│   └── main
│       └── MainMkdirs.class
├── def // 定義ファイル格納先(任意)
│   └── path_data.txt
├── out // 出力ディレクトリ(任意)
└── src // ソースファイル格納先
    ├── dto
    │   └── PathInfoDTO.java
    ├── fnc
    │   └── MkdirsFnc.java
    ├── gui
    │   └── InputGui.java
    └── main
        └── MainMkdirs.java

・メインクラス

package main;

import gui.InputGui;

// メイン処理クラス
public class MainMkdirs {
	public static void main(String[] args) {
		// 入力画面の呼び出し
		new InputGui();
	}
}

・ディレクトリ作成画面クラス

package gui;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import dto.PathInfoDTO;
import fnc.MkdirsFnc;

// ディレクトリ作成画面クラス
public class InputGui extends JFrame implements ActionListener{
	/*
	 * フィールド宣言
	 * ・ラベル
	 * 		定義ファイル
	 * 		出力ディレクトリパス
	 * ・テキストボックス
	 * 		定義ファイル(フルパス)
	 * 		出力ディレクトリパス(フルパス)
	 * ・「作成」ボタン
	 */
	JLabel l_input_def_path = new JLabel("定義ファイル(フルパス):");
	JLabel l_output_dir_path = new JLabel("出力ディレクトリ(フルパス):");
	JTextField txt_input_def_path = new JTextField(30);
	JTextField txt_output_dir_path = new JTextField(30);
	JButton btn_make_dirs = new JButton("作成");
	
	// コンストラクタ
	public InputGui(){
		// GUI画面の設定
		getContentPane().setLayout(new FlowLayout());
		
		// 定義ファイルパス関連の設置
		getContentPane().add(l_input_def_path);
		getContentPane().add(txt_input_def_path);

		// 出力ディレクトリ関連の設置
		getContentPane().add(l_output_dir_path);
		getContentPane().add(txt_output_dir_path);
		
		// 作成ボタンの設置
		getContentPane().add(btn_make_dirs);
		
		// 作成ボタンの処理設定
		btn_make_dirs.addActionListener(this);

		// GUIを閉じた時、プログラムも終了
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// サイズを設定
		setSize(400, 200);
		
		// GUI画面の可視化
		setVisible(true);
	}
	
	// ボタン押下時の処理
	public void actionPerformed(ActionEvent ae) {
		if(ae.getSource() == btn_make_dirs) {
			// DTOクラスのインスタンス
			PathInfoDTO pathdto = new PathInfoDTO();
			
			// 定義ファイルパスをセット
			pathdto.setStrDefPath(txt_input_def_path.getText());
			
			// 出力先のディレクトリパスをセット
			pathdto.setStrOutPath(txt_output_dir_path.getText());
			
			// ディレクトリ作成クラスのインスタンス
			MkdirsFnc mf = new MkdirsFnc();
			
			// ディレクトリ作成処理呼び出し
			mf.makedirs(pathdto);
			
			// ディレクトリ作成処理終了後のメッセージ出力
			JOptionPane.showMessageDialog(null,
					pathdto.getResultMsg(),
					"ディレクトリ作成処理",
					JOptionPane.INFORMATION_MESSAGE);
		}
	}
}

・ディレクトリ作成処理クラス

package fnc;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import dto.PathInfoDTO;

// ディレクトリ作成クラス
public class MkdirsFnc {
	/* ディレクトリ作成処理
	 * ・処理概要
	 * 		入力した定義ファイル(フルパス)をインプットに
	 * 		出力ディレクトリ(フルパス)ディレクトリを作成する
	 * ・引数:
	 * 		ディレクトリ作成DTOクラス
	 * ・戻り値:
	 * 		なし
	 */
	public void makedirs(PathInfoDTO pathdto) {
		// 処理完了メッセージの初期値セット
		String result_message = "";
		try {
			
			// Fileクラスをインスタンス(定義ファイル)
			File def = new File(pathdto.getStrDefPath());
			// FileReaderクラスのインスタンス
			FileReader fr = new FileReader(def);
			// BufferedReaderクラスのインスタンス
			BufferedReader br = new BufferedReader(fr);
			
			// 定義ファイルの1行目を文字列として格納
			String read_line = br.readLine();
			
			// 定義ファイルの行数分繰り返し
			while(read_line != null) {
				
				// 出力ディレクトリ(フルパス)+定義ファイルの内容
				String out_dir = pathdto.getStrOutPath() + "/" + read_line;
				// Fileクラスのインスタンス(出力ディレクトリ)
				File make_dirs_path = new File(out_dir);
				// ディレクトリ作成(サブディレクトリ含む)
				make_dirs_path.mkdirs();
				// 定義ファイルの次の行を文字列として格納
				read_line = br.readLine();
			}
			
			// BufferedReaderクラスをクローズ
			br.close();
			
			// 処理完了メッセージ格納(正常系)
			result_message = "完了!";
		
		// 例外処理
		}catch(Exception e){
			// 処理完了メッセージ格納(異常系)
			result_message = "エラー:" + e;
		
		// 終了処理
		}finally {
			// 処理完了メッセージをディレクトリ作成DTOクラスにセット
			pathdto.setResultMsg(result_message);
		}
	}
}

・ディレクトリ作成DTOクラス

package dto;

import java.io.Serializable;

// ディレクトリ作成DTOクラス
public class PathInfoDTO  implements Serializable{
	
	/*
	 *	フィールド
	 *	・定義ファイルパス(フルパス)
	 *	・出力ディレクトリパス(フルパス)
	 *	・処理完了メッセージ
	 */
	private String str_def_path;
	private String str_out_path;
	private String result_msg;
	
	// 定義ファイルパスのゲッターとセッター
	public String getStrDefPath() {
		return str_def_path;
	}
	public void setStrDefPath(String str_def_path) {
		this.str_def_path = str_def_path;
	}
	
	// 出力ディレクトリのゲッターとセッター
	public String getStrOutPath() {
		return str_out_path;
	}
	public void setStrOutPath(String str_out_path) {
		this.str_out_path = str_out_path;
	}
	
	// 処理完了メッセージのゲッターとセッター
	public String getResultMsg() {
		return result_msg;
	}
	public void setResultMsg(String result_msg) {
		this.result_msg = result_msg;
	}
}

■実行結果

▼正常系

・「定義ファイル(フルパス)」および「出力ディレクトリ(フルパス)」にそれぞれ値を入力し、「作成」ボタンを押下する。


・完了のメッセージボックスを出力


・出力ディレクトリに、定義ファイルで記入したディレクトリが作成されていることを確認。

make_dirs
└── out
    ├── a
    │   └── b
    │       └── c
    ├── d
    │   └── e
    ├── f
    ├── g
    │   └── h
    │       └── i
    │           └── j
    ├── k
    │   └── l
    ├── m
    │   └── n
    │       └── o
    │           └── p
    │               └── q
    │                   └── r
    ├── s
    │   └── t
    │       └── u
    ├── v
    │   └── w
    │       └── x
    │           └── y
    └── z

▼異常系

・何も入力せずに「作成」ボタンを押下。


・エラーメッセージを出力。

■参考

「ディレクトリ作成ツール」を作成するにあたり、参考とさせていただいた外部リンクおよび内部リンクを示す。

▼外部リンク

・ディレクトリ作成(サブディレクトリ含む)

▼内部リンク

・ファイル読み込み処理


・GUI画面作成


・GitHub

コメント