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;
}
}