拷貝文件和文件夾

package ums.zxcomc.pm.maf.cbwa.pmpcommon.comm.pmcollect;

 

import java.io.*;

import ums.uep.api.util.DebugPrn;
import ums.zxcomc.pm.maf.cbwa.pmpcommon.comm.PmpMafConst;

 

/**
 * <p>文件名稱: CbwaFileCopyManager.java</p>
 * <p>文件描述: 文件和文件夾的拷貝類,支持多層子目錄嵌套</p>
 * <p>版權所有: </p>
 * <p>公    司: </p>
 * <p>內容摘要: </p>
 * <p>其他說明: </p>
 * <p>完成日期:2010-6-4</p>
 * <p>修改記錄1: </p>
 * <pre>
 *    修改日期:
 *    版 本 號:
 *    修 改 人:
 *    修改內容:
 * </pre>
 * <p>修改記錄2:…</p>
 * @version 1.0
 * @author  
 */
public class CbwaFileCopyManager {

    private static DebugPrn debugPrn = new DebugPrn(CbwaPmCollectInfoExport.class.getName());
   
    /**
     * 拷貝文件或者文件夾
     * @param srcFileName 源文件(夾)的限定名
     * @param destFileName 目標文件(夾)的限定名
     * @param overlay 是否允許覆蓋文件
     * @return boolean 拷貝是否成功
     */
    public boolean copyFileOrFolder(String srcFileName, String destFileName, boolean overlay){
       
        File srcFile = new File(srcFileName);
        // 判斷源文件(夾)是否存在
        if (!srcFile.exists()) {
            debugPrn.info("The source file/folder doesn't exist: " +  srcFileName);
            return false; 
        }
       
        if(srcFile.isFile())
        {
            //拷貝文件
            boolean isOK = copyFile(srcFileName, destFileName, overlay);
            if(!isOK)
            {
                debugPrn.warn("Fail to copy file: " +  srcFileName);
                return false; 
            }
        }
        else if(srcFile.isDirectory())
        {
            //拷貝文件夾
            boolean isOK = copyFolder(srcFileName, destFileName, overlay);
            if(!isOK)
            {
                debugPrn.warn("Fail to copy folder: " +  srcFileName);
                return false; 
            }
        }
        else
        {
            debugPrn.info("The source file/folder isn't valid : " +  srcFileName);
            return false;
        }
        return true;
    }
   
    /**
     * 拷貝文件
     * @param srcFileName 源文件的限定名
     * @param destFileName 目標文件的限定名
     * @param overlay 是否允許覆蓋文件
     * @return boolean 拷貝是否成功
     */
    private boolean copyFile(String srcFileName, String destFileName, boolean overlay){
       
        // 判斷目標文件是否存在
        File destFile = new File(destFileName);
        if (destFile.exists()) {
            //如果目標文件存在
            if (overlay) {
                // 允許覆蓋文件:則先刪除目標文件
                if(!destFile.delete())
                {
                    //如果刪除失敗
                    debugPrn.warn("Fail to delete the File:" + destFileName);
                    return false;
                }
            }
            else
            {
                //不允許覆蓋,直接返回,不視爲拷貝失敗
                debugPrn.info("Not allowed to overwrite the file: " + destFileName);
                return true;
            }
        } else {
            // 如果目標文件所在目錄不存在,則先創建目錄
            if (!destFile.getParentFile().exists()) {
                // 目標文件所在目錄不存在
                if (!destFile.getParentFile().mkdirs()) {
                    // 創建目標文件所在目錄失敗
                    debugPrn.warn("Fail to mkdirs by the path: " +  destFileName);
                    return false;
                }
            }
        }

        //開始複製文件
        File srcFile = new File(srcFileName);
        int byteread = 0; //讀取的字節數
        InputStream in = null;
        OutputStream out = null;
        BufferedOutputStream bufferedOut = null;
        BufferedInputStream bufferedIn = null;

        try {
            in = new FileInputStream(srcFile);
            out = new FileOutputStream(destFile);
            bufferedIn = new BufferedInputStream(in);
            bufferedOut= new BufferedOutputStream(out);
            byte[] buffer = new byte[1024];

            while ((byteread = bufferedIn.read(buffer)) != -1) {
                bufferedOut.write(buffer, 0, byteread);
            }
            bufferedOut.flush();
            return true;
        } catch (FileNotFoundException e) {
            debugPrn.warn("FileNotFoundException in copyFile: ", e);
            return false;
        } catch (IOException e) {
            debugPrn.warn("IOException in copyFile: ", e);
            return false;
        } finally{
            if (bufferedOut != null)
            {
                try
                {
                    bufferedOut.close();  
                }
                catch(IOException e)
                {
                    bufferedOut = null;
                    debugPrn.warn("IOException in copyFile: ", e);
                }
            }
            if (bufferedIn != null)
            {
                try
                {
                    bufferedIn.close();  
                }
                catch(IOException e)
                {
                    bufferedIn = null;
                    debugPrn.warn("IOException in copyFile: ", e);
                }
            }
        }
    }
   
   
    /**
     * 拷貝文件夾,支持多層嵌套的文件夾拷貝
     * @param srcFolderName 源文件夾的限定名
     * @param destFolderName 目標文件夾的限定名
     * @param overlay 是否允許覆蓋文件
     * @return boolean 拷貝是否成功
     */
    private boolean copyFolder(String srcFolderName, String destFolderName, boolean overlay){

        File srcFolder = new File(srcFolderName);
        File destFolder = new File(destFolderName);

        if(!destFolder.exists())
        {
            if(!destFolder.mkdirs())
            {
                debugPrn.warn("Fail to mkdirs: " +  destFolderName);
                return false;
            }
        }
        String[] subFileFolderList =  srcFolder.list();
        for(int i = 0; i < subFileFolderList.length; i++)
        {
            String srcSubFileName = srcFolderName + PmpMafConst.SEPARATOR +subFileFolderList[i]; //子文件(夾)的源路徑
            String deskSubFileName = destFolderName + PmpMafConst.SEPARATOR + subFileFolderList[i];
             
            boolean isOK = copyFileOrFolder(srcSubFileName, deskSubFileName, overlay);
            if(!isOK)
            {
                debugPrn.warn("Fail to copy: " +  srcSubFileName);
                return false;
            }
        }
       
        return true;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章