解説動画
前回の一覧取得同様、サブフォルダを含んだ一括コピーはそのままできないので、再帰的に行います。
こちらもメソッドで再帰せず、クラスで再帰してます。
■動画はこちら
■Youtube版の解説で使用しているソースコード
動画と一緒にこちらも参考にどうぞ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import java.io.File; import java.io.IOException; public class FileListMain { public static void main(String[] args) { try { String srcPathName = "D:\\work\\20230615\\test_File"; String destPathName = "D:\\work\\20230615\\test_File2"; //コピー元のフォルダ名(test_File)を取得 File srcFile = new File(srcPathName); //コピー先のフォルダ名に、コピー元のフォルダ名(test_File)を追加 destPathName += File.separator + srcFile.getName(); //コピー先のルートフォルダ(test_File)を作成 File destFile = new File(destPathName); destFile.mkdir(); //フォルダ内のコピー FileList fileList = new FileList(srcPathName); fileList.copy(destPathName); } catch (IOException e) { e.printStackTrace(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class FileList { private String currentPath = null; private File[] files = null; public FileList(String path) { currentPath = path; File file = new File(path); files = file.listFiles(); } public void report() { for(File f : files) { reportFile(f); } } private void reportFile(File file) { //自分のファイル(フォルダ)の情報を出力する //ファイル名の取得 String fileName = currentPath + File.separator + file.getName(); //ファイルの情報を出力 System.out.println(fileName); //フォルダの場合は、さらに自分のサブフォルダを見る if(file.isDirectory()) { FileList fileList = new FileList(fileName); fileList.report(); } } public void copy(String destPathName) throws IOException { for(File f : files) { copyFile(f, destPathName); } } private void copyFile(File file, String destPathName) throws IOException { //自分のファイル(フォルダ)をコピーする //自分のファイル名の取得 String fileName = currentPath + File.separator + file.getName(); //ファイルをコピー(フォルダの場合、フォルダだけ作成) Path srcPath = Paths.get(fileName); Path destPath = Paths.get(destPathName + File.separator + file.getName()); Files.copy(srcPath, destPath); //フォルダの場合は、さらに自分のサブフォルダを見る if(file.isDirectory()) { FileList fileList = new FileList(fileName); fileList.copy(destPathName + File.separator + file.getName()); } } } |
※今回は、前回のソースを改造していて、同じ流れにしてあります。
流れを少し変えると、こんな感じでも書けますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class FileList { private String currentPath = null; private File[] files = null; public FileList(String path) { currentPath = path; File file = new File(path); files = file.listFiles(); } public void report() { for(File f : files) { reportFile(f); } } private void reportFile(File file) { //自分のファイル(フォルダ)の情報を出力する //ファイル名の取得 String fileName = currentPath + File.separator + file.getName(); //ファイルの情報を出力 System.out.println(fileName); //フォルダの場合は、さらに自分のサブフォルダを見る if(file.isDirectory()) { FileList fileList = new FileList(fileName); fileList.report(); } } public void copy(String destPathName) throws IOException { //自分のフォルダを作成 File destFile = new File(destPathName); destFile.mkdir(); //自分のフォルダ内をコピーする for(File f : files) { copyFile(f, destPathName); } } private void copyFile(File file, String destPathName) throws IOException { //自分のファイル名(フォルダ名)の取得 String fileName = currentPath + File.separator + file.getName(); //フォルダ・ファイルの判定 if(file.isDirectory()) { //フォルダの場合は、さらに自分のサブフォルダを見る FileList fileList = new FileList(fileName); fileList.copy(destPathName + File.separator + file.getName()); }else { //ファイルの場合は、コピーする Path srcPath = Paths.get(fileName); Path destPath = Paths.get(destPathName + File.separator + file.getName()); Files.copy(srcPath, destPath); } } } |