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