/*
 * FileUtil.java
 *
 * Created on 2007/02/09, 12:38
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package org.itscool.commons.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * ファイル操作関係のユーティリティクラスです
 *
 * @author kano
 */
public class FileUtil {
    /**
     * 単一ファイルのコピーを行います
     * @param from コピー元ファイルのパス
     * @param to コピー先ファイルのパス
     * @throws ファイルコピーに失敗した場合はFileUtilExceptionをスローします
     */
    public static void copy(String from, String to ){
        try{
            File file = new File(from);
            if(file.isDirectory()) return;
            
            int data;
            // ファイル入力ストリームを取得
            InputStream fr = new BufferedInputStream(new FileInputStream(from));
            //　ファイル出力ストリームを取得
            OutputStream fw = new BufferedOutputStream( new FileOutputStream(to));
            while((data=fr.read())!=-1){
                fw.write(data);
            }
            fw.close();
            
            //ファイルの更新日付をコピー元に併せる
            File fromFile = new File(from);
            File toFile = new File(to);
            toFile.setLastModified(fromFile.lastModified());
            
        }catch(IOException ex){
            throw new FileUtilException(ex.getMessage());
        }
    }
    
    /**
     * ディレクトリ単位のファイルのコピーを行います
     * @param fromDir コピー元のディレクトリ
     * @param toDir コピー先のディレクトリ
     * @return ディレクトリ単位のコピーに成功した場合はtrueを返します
     */
    public static boolean copyAll(String fromDir, String toDir){
        boolean ret = true;
        File file = new File(toDir);
        if(!file.isDirectory()){
            file.mkdirs();
        }
        String[] list = getFileList(fromDir);
        for(int i=0; i<list.length; i++){
            try{
                copy(fromDir+"/" + list[i], toDir+"/"+list[i]);
            }catch(Exception e){
                System.out.println(e.getMessage());
                ret = false;
            }
        }
        return ret;
    }
    
    /**
     * 指定したディレクトリ配下に存在するファイルリストを取得します
     * @param path パス
     * @return ファイルリストの一覧を返します。
     * ファイルが存在しない、あるいは指定されたパスがディレクトリで
     * 無い場合は、サイズ０の配列を返します
     */
    public static String[] getFileList(String path){
        String[] list = new String[0];
        File file = new File(path);
        if( !file.isDirectory()){
            return list;
        }
        return file.list();
    }
    
    /**
     * 指定されたファイルを削除します
     * @param fileName ファイル名
     * @throws ファイルの削除に失敗した場合はFileUtilExceptionをスローします
     */
    public static void delete(String fileName ){
        try{
            File file = new File(fileName);
            if(file.isDirectory()) return;
            
            if( !file.delete() ){
                throw new FileUtilException("delete failed [" + fileName + "]");
            }
        }catch(Exception ex){
            throw new FileUtilException(ex.getMessage());
        }
    }
    
    /**
     * 指定されたディレクトリ配下のファイルを全て削除します
     * @param dir パス
     * @return 全てのファイル削除に成功した場合はtrueを返します
     * @throws 指定されたパスがディレクトリで無い場合はFileUtilExceptionをスローします
     */
    public static boolean deleteAll(String dir){
        boolean ret = true;
        File file = new File(dir);
        if(!file.isDirectory()){
            throw new FileUtilException("directory not found [" + dir + "]");
        }
        String[] list = getFileList(dir);
        for(int i=0; i<list.length; i++){
            try{
                delete(dir+"/" + list[i]);
            }catch(Exception e){
                System.out.println(e.getMessage());
                ret = false;
            }
        }
        return ret;
    }
    
    /**
     * 指定されたパスの最終更新日を取得します<br/>
     * 指定されたパスがファイルで無い場合は0を返します
     * @param path ファイルパス
     * @return long 最終更新日
     */
    public static long getLastModified(String path) {
        File file = new File(path);
        if( file.isFile()){
            long lastModified = file.lastModified();
            return lastModified;
        }else{
            return 0;
        }
    }
    
    public static boolean isFile(String path){
        if( path == null || path.length() == 0){
            return false;
        }
        File file = new File(path);
        if( file != null && file.isFile()){
            return true;
        }else{
            return false;
        }
    }
}
