/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCFileUtil
*   ソースファイル名：JCCFileUtil.java
*   作成者          ：富士通
*   日付            ：2011年04月25日
*＜機能概要＞
*	ファイル操作を行います
* 
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/04/25   富士通    新規作成
*
**********************************************************************/
package eo.common.util;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.rmi.server.UID;
import eo.common.util.JCCFrameworkException;

/**
 * <dl>
 *
 * @version 1.0
 * @author 富士通株式会社
 */
public class JCCFileUtil {

	/**
	 * 指定されたディレクトリをその直下のファイルごと削除する。
	 * @param dirPath ファイルの絶対パス
	 * @return boolean 正常に削除された場合、trueを返却する。
	 */
	synchronized public static boolean removeDir(String dirPath) throws JCCFrameworkException{
		return JCCFileUtil.removeDirRecursive(dirPath);
	}
	
	// 2011024 FST START
	private static boolean removeDirRecursive(String dirPath) {
		// 入力パスのFileインスタンスの生成
		File f_dirPath = new  File(dirPath);
		String fileName = null;
		boolean result = false;
		if(f_dirPath == null || !f_dirPath.exists())
		{
			return true;
		}
		
		if(f_dirPath.isFile())
		{
			if(f_dirPath.exists())
			{
				result = f_dirPath.delete();
			}
		}
		else
		{
			File[] fileList = f_dirPath.listFiles();
			for (int i = 0; i < fileList.length; i++)
			{
				fileName = fileList[i].getParent() + File.separator + fileList[i].getName();
				removeDirRecursive(fileName);
			}
			result = f_dirPath.delete();
		}
		return result;
	}
	// 2011024 FST END
	
	/**
	 * ファイルのサイズをKバイト表記で返却する。
	 * 
	 * @param filePath ファイルの絶対パス
	 * @return ファイルのサイズ（Kバイト表記）
	 */
	public static String getFileSize(String filePath) throws Exception{

		// 入力パスのFileインスタンスの生成
		File f_filePath = new  File(filePath);

		// ファイルのサイズ取得
		String fileSize_K = null;
// 20110424 FST 計算式の修正 START
//		fileSize_K = String.valueOf(f_filePath.length()/1024);
		// 1Kバイト未満のファイルを0KB(ゼロバイト)に見せないように修正
		fileSize_K = String.valueOf(f_filePath.length()/1024 + (f_filePath.length() % 1024 > 0 ? 1 : 0) );
// 20110424 FST 計算式の修正 END
		
		// ファイルサイズの返却
		return fileSize_K;

	}

	/**
	 * 実ファイル化した圧縮元ファイルと圧縮後ファイルを削除する
	 * 
	 * @param file　削除対象ファイルオブジェクト(絶対パス)
	 */
	public static void fin(String filepath,String compfilepath) throws Exception{

		//圧縮後ファイルとディレクトリの削除
		if(compfilepath != null){
			// 作業ディレクトリが残っていた場合、削除
			File f_dir = new File(new File(compfilepath).getParent());
			try {
				if(f_dir.exists()){
					removeDir(new File(compfilepath).getParent());
				}
			} catch (Exception e1) {

			}
		}

		//圧縮前ファイルとディレクトリの削除
		if(filepath != null){
			// 作業ディレクトリが残っていた場合、削除
			File f_dir = new File(new File(filepath).getParent());
			try {
				if(f_dir.exists()){
					removeDir(new File(filepath).getParent());
				}
			} catch (Exception e1) {

			}
		}
	}
	
	/**
	 * 一意の作業ディレクトリパスを作成する
	 * 
	 * @param dir_tmp 作業ディレクトリ(絶対パス)
	 * @return String 一意の作業ディレクトリパス
	 */
	public static String createDirUid(String dir_tmp) throws Exception{

		// ディレクトリが重複しないようにマシンで一意であるUIDを取得し、作業ディレクトリ名とする。
		String uid = new UID().toString();
		// ファイル名に使用しない":"や"-"は、"_"に変換する。
		uid = uid.replace(":", "_");
		uid = uid.replace("-", "0");
	
		//圧縮前ファイルを実ファイル化する(作業ディレクトリパス＋ＵＩＤディレクトリ＋引数のファイル名(拡張子付き))
		//{圧縮ファイル保存先}/uid/ファイル名
		dir_tmp = dir_tmp + File.separator +"_"+ uid;
		return dir_tmp;
	}
	
	/**
	 * 一意の作業ファイルパスを作成する
	 * 
	 * @param dir_tmp 作業ディレクトリ(絶対パス)
	 * @return String 一意の作業ファイルパス
	 */
	
	public static String createFileNameUid(String dir_tmp) throws Exception{
		return createDirUid(dir_tmp);
	}
	
	/**
	 * 作業ディレクトリを作成する
	 * 
	 * @param file_path 作業ディレクトリパス
	 * @return File ファイルオブジェクト
	 */
	public static File createDir(String file_path) throws Exception{

		// ディレクトリを作成
		// すでにディレクトリが存在している場合は例外をスロー
		File file = new File(file_path);
		if(file.getParentFile().mkdir()==false){
			throw new Exception("作業ディレクトリの作成に失敗しました。(ディレクトリ指定の誤り／書き込み権限／同名ディレクトリの有無を確認してください)：" + file_path);
		}
		return file;
	}

	/**
	 * 入力ストリームから読込んで出力ストリームに書き込む
	 * 
	 * @param inputStream 入力ストリーム
	 * @param outputStream 出力ストリーム
	 * @return OutputStream 出力ストリーム
	 * @throws Exception
	 */
	public static OutputStream writeOutputStream(InputStream inputStream, OutputStream outputStream) throws Exception{

		// 出力ストリームに書き込む
		int bytes;
		byte b[] = new byte[5120];
		while ((bytes = inputStream.read(b)) != -1){
			outputStream.write(b, 0, bytes);
		}
		return outputStream;
	}

}
