package name.wasi.util;
import java.io.*;
import java.nio.channels.FileChannel;
/**
* ファイルのコピーをするクラスです
* ファイルやディレクトリのコピーを行います
* @author wasi
* @version 1.0
*/
public class FileCopyManager {
/**
* デバッグログ出力モード
*/
private boolean debugLogMode = false;
/**
* ディレクトリ削除モード
*/
private boolean dirDelMode = false;
/**
* 初回呼び出しフラグ
*/
private boolean isFirstCall = false;
/**
* コンストラクター
*/
public FileCopyManager() {
super();
}
/**
* デバッグログ出力モード設定
* デバッグログの出力可否を設定します
* デフォルト値は false です
* @param debugLogMode デバッグログ出力モード(出力する:true / 出力しない:false)
*/
public void setDebugLogMode(boolean debugLogMode) {
this.debugLogMode = debugLogMode;
}
/**
* ディレクトリ削除モード設定
* コピー先に同一ディレクトリが存在する場合に,一旦削除するかを指定します
* デフォルト値は false です
* @param dirDelMode ディレクトリ削除モード(削除する:true / 削除しない:false)
*/
public void setDirDeleteMode(boolean dirDelMode) {
this.dirDelMode = dirDelMode;
}
/**
* コピー実行
* @param baseFilePath コピー元ファイルパス
* @param generateFilePath コピー先ファイルパス
* @return boolean 実行結果(成功:true / 失敗:false)
* @throws Exception 例外
*/
public boolean copy(String baseFilePath, String generateFilePath) throws Exception {
this.isFirstCall = true;
return this.execute(baseFilePath, generateFilePath);
}
/**
* 処理実行
* @param baseFilePath コピー元ファイルパス
* @param generateFilePath コピー先ファイルパス
* @return boolean 実行結果(成功:true / 失敗:false)
* @throws Exception 例外
*/
private boolean execute(String baseFilePath, String generateFilePath) throws Exception {
boolean rtn = false;
File baseFile = new File(baseFilePath);
File generateFile = new File(generateFilePath);
// 指定パスがディレクトリの場合
if (baseFile.isDirectory()) {
boolean isExists = generateFile.exists();
// ディレクトリが存在し、最初の呼出であり、ディレクトリ削除モードの場合、コピー先ディレクトリ削除
if (isExists && this.isFirstCall && this.dirDelMode) {
if (!this.delete(generateFile)) {
this.printSystemOut("ディレクトリ削除に失敗しました:" + generateFile.getName());
return false;
}
isExists = false;
}
if (!isExists) {
try {
if (!generateFile.mkdirs()) {
this.printSystemOut("ディレクトリの作成に失敗しました:" + generateFile.getName());
return false;
}
} catch (SecurityException e) {
this.printSystemOut("ディレクトリ作成の権限がありません:" + generateFile.getName());
throw e;
}
}
this.isFirstCall = false;
// ディレクトリ内ファイルの処理
File[] baseChildList = baseFile.listFiles();
if (baseChildList != null) {
for (int iii = 0; iii < baseChildList.length; iii++) {
boolean childRet = this.execute(baseChildList[iii].getAbsolutePath()
, generateFile.getAbsolutePath() + File.separator + baseChildList[iii].getName());
if (!childRet) {
this.printSystemOut("ディレクトリ内ファイルコピーに失敗しました:" + baseChildList[iii].getName());
return false;
}
}
}
rtn = true;
// 指定パスがファイルの場合
} else {
this.isFirstCall = false;
this.fileCopy(baseFile, generateFile);
rtn = true;
}
return rtn;
}
/**
* ファイルコピー
* @param baseFile コピー元ファイル
* @param generateFile コピー先ファイル
* @throws Exception 例外
*/
private void fileCopy(File baseFile, File generateFile) throws Exception {
FileChannel baseChannel = null;
FileChannel generateChannel = null;
try {
baseChannel = new FileInputStream(baseFile).getChannel();
generateChannel = new FileOutputStream(generateFile).getChannel();
baseChannel.transferTo(0, baseChannel.size(), generateChannel);
} catch (Exception e) {
this.printSystemOut("ファイルのコピーに失敗しました");
throw e;
} finally {
if (baseChannel != null) {
baseChannel.close();
}
if (generateChannel != null) {
generateChannel.close();
}
}
}
/**
* ファイル削除
* @param deleteFiles 削除ファイル
* @return boolean 実行結果(成功:true / 失敗:false)
* @throws Exception 例外
*/
private boolean delete(File[] deleteFiles) throws Exception {
for (int iii = 0; iii < deleteFiles.length; iii++) {
if (!this.delete(deleteFiles[iii])) {
return false;
}
}
return true;
}
/**
* ファイル削除
* @param deleteFile 削除ファイル
* @return boolean 実行結果(成功:true / 失敗:false)
* @throws Exception 例外
*/
private boolean delete(File deleteFile) throws Exception {
boolean rtn = false;
// ディレクトリの場合
if (deleteFile.isDirectory()) {
// ディレクトリ内ファイルの削除
File[] childList = deleteFile.listFiles();
if (childList != null) {
if (!this.delete(childList)) {
return false;
}
}
}
// ファイルまたはディレクトリの削除
try {
if (!(rtn = deleteFile.delete())) {
this.printSystemOut("ファイルまたはディレクトリの削除に失敗しました : " + deleteFile.getName());
}
} catch (SecurityException e) {
this.printSystemOut("ファイルまたはディレクトリ削除の権限がありません : " + deleteFile.getName());
throw e;
}
return rtn;
}
/**
* デバッグログメッセージ出力
* @param logMsg ログメッセージ
*/
private void printSystemOut(String logMsg) {
if (this.debugLogMode) {
System.out.println(logMsg);
}
}
}