Java 如何在loadonstartup时复制嵌套文件夹中的文件夹?

Java 如何在loadonstartup时复制嵌套文件夹中的文件夹?,java,fileutils,Java,Fileutils,我有大约150个文件夹,每个文件夹中都有图像,我试图将整个目录复制到另一个目录中。对于少数目录,它会在自动停止后工作,而不会引发任何错误或异常。我正在使用FileUtils方法来实现这一点 org.apache.commons.io.FileUtils.copyDirectoryToDirectory(originalImageFolder, new File(this.ctx.getRealPath(newFilePath))); 我提供了一个替代解决方案,无需使用第三方,如apache F

我有大约150个文件夹,每个文件夹中都有图像,我试图将整个目录复制到另一个目录中。对于少数目录,它会在自动停止后工作,而不会引发任何错误或异常。我正在使用
FileUtils
方法来实现这一点

org.apache.commons.io.FileUtils.copyDirectoryToDirectory(originalImageFolder, new File(this.ctx.getRealPath(newFilePath)));

我提供了一个替代解决方案,无需使用第三方,如apache FileUtils。这可以通过命令行完成

我在Windows上进行了测试,它对我很有效。下面是一个Linux解决方案

在这里,我使用Windows命令复制所有文件,包括子目录。 我传递的参数定义如下

  • /电子复制所有子目录,即使它们是空的
  • /i-如果源是目录或包含通配符和目标 不存在,xcopy假定目标指定目录名 并创建一个新目录。然后,xcopy复制所有指定的文件 进入新目录
  • /h-复制具有隐藏和系统文件属性的文件。默认情况下, xcopy不复制隐藏文件或系统文件
我的示例利用该类构造一个进程来执行copy(xcopy&cp)命令

窗口:

String src = "C:\\srcDir";
String dest = "C:\\destDir";
List<String> cmd = Arrays.asList("xcopy", src, dest, "/e", "/i", "/h");
try {
    Process proc = new ProcessBuilder(cmd).start();
    BufferedReader inp = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    String line = null;
    while ((line = inp.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}
String src=“C:\\srcDir”;
String dest=“C:\\destDir”;
List cmd=Arrays.asList(“xcopy”、src、dest、“/e”、“i”、“h”);
试一试{
processproc=newprocessbuilder(cmd.start();
BufferedReader inp=新的BufferedReader(新的InputStreamReader(proc.getInputStream());
字符串行=null;
而((line=inp.readLine())!=null){
系统输出打印项次(行);
}
}捕获(IOE异常){
e、 printStackTrace();
}
Linux:

String src = "srcDir/";
String dest = "~/destDir/";
List<String> cmd = Arrays.asList("/bin/bash", "-c", "cp", "r", src, dest);
try {
    Process proc = new ProcessBuilder(cmd).start();
    BufferedReader inp = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    String line = null;
    while ((line = inp.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}
String src=“srcDir/”;
字符串dest=“~/destDir/”;
List cmd=Arrays.asList(“/bin/bash”、“-c”、“cp”、“r”、src、dest);
试一试{
processproc=newprocessbuilder(cmd.start();
BufferedReader inp=新的BufferedReader(新的InputStreamReader(proc.getInputStream());
字符串行=null;
而((line=inp.readLine())!=null){
系统输出打印项次(行);
}
}捕获(IOE异常){
e、 printStackTrace();
}

一个组合,可以在WindowsLinux环境下工作

private静态最终字符串OS=System.getProperty(“OS.name”);
私有静态字符串src=null;
私有静态字符串dest=null;
私有静态列表cmd=null;
公共静态void main(字符串[]args){
如果(OS.toLowerCase()包含(“windows”){//安装windows环境
src=“C:\\srcDir”;
dest=“C:\\destDir”;
cmd=Arrays.asList(“xcopy”、“src、dest”、“s”、“e”、“i”、“h”);
System.out.println(“on:+OS”);
}else如果(OS.toLowerCase().contains(“linux”){//安装linux环境
src=“srcDir/”;
dest=“~/destDir/”;
cmd=Arrays.asList(“/bin/bash”、“-c”、“cp”、“r”、src、dest);
System.out.println(“on:+OS”);
}
试一试{
processproc=newprocessbuilder(cmd.start();
BufferedReader inp=新的BufferedReader(新的InputStreamReader(proc.getInputStream());
字符串行=null;
而((line=inp.readLine())!=null){
系统输出打印项次(行);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}

您是否尝试了FileUtils.copyDirectory(文件srcDir,文件destDir)?您是在Windows还是Linux上?我可能有另一种解决方案。@VictorS FileUtils.copyDirectory(文件srcDir,文件destDir)也不工作。我试过了。我需要两个平台的解决方案,即它应该在两台机器上工作。感谢您的回复,但这些是单独的代码片段。但是我正在寻找可以在每个平台上工作的通用代码(Java是平台独立的)。每个平台都可以有一段代码吗?@NeerajNeeraj作为一种可能的解决方案,将命令作为命令行参数传入。调用应用程序时,在要运行的类的名称后指定命令。我建议这样做,因为这两个文件之间的唯一区别是传递给asList()方法的命令。如果你愿意,我可以提供一个例子来说明如何做到这一点。@NeerajNeeraj只是为了补充上述建议。只需将一个参数传递给应用程序(例如Linux或Win),就可以进一步简化它。在代码中,您可以使用switch语句或if检查条件来控制行为(分配适当的复制命令)。@NeerajNeeraj我的最后一个示例是针对Windows和Linux的完全编码解决方案。这对你有用吗?嗨,维克多,这个解决方案也不是复制所有文件夹。我尝试了这段代码,它只复制了当前文件夹总数的1/3。
private static final String OS = System.getProperty("os.name");
private static String src = null;
private static String dest = null;
private static List<String> cmd = null;

public static void main(String[] args) {
    if (OS.toLowerCase().contains("windows")) { // setup WINDOWS environment
        src = "C:\\srcDir";
        dest = "C:\\destDir";
        cmd = Arrays.asList("xcopy", src, dest, "/s", "/e", "/i", "/h");

        System.out.println("on: " + OS);
    } else if (OS.toLowerCase().contains("linux")){ // setup LINUX environment
        src = "srcDir/";
        dest = "~/destDir/";
        cmd = Arrays.asList("/bin/bash", "-c", "cp", "r", src, dest);

        System.out.println("on: " + OS);
    }

    try {
        Process proc = new ProcessBuilder(cmd).start();
        BufferedReader inp = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        String line = null;
        while ((line = inp.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}