使用Java将目录复制到另一个目录

时间:2020-08-18 12:13:24

标签: java

我想使用Java将网络侧文件夹复制到另一个文件夹。我为此使用FileUtils.copyDirectoryToDirectory。我用servlet编写了这些代码。

    String salesOrder=request.getParameter("salesOrder");       
    String url_archive="http://localhost:8983/solr/archiveCore";
    SolrClient solr_archive=new HttpSolrClient.Builder(url_archive).build();
    ((HttpSolrClient) solr_archive).setParser(new XMLResponseParser());
    SolrQuery query_archive = new SolrQuery();
    query_archive.setQuery("strSO:"+salesOrder);
    query_archive.setRows(999999);
    query_archive.setStart(0);
    query_archive.set("defType", "edismax");
    try {
        QueryResponse resp_archive = solr_archive.query(query_archive);
        SolrDocumentList list_archive = resp_archive.getResults();
        String filePath=list_archive.get(0).getFieldValue("FilePath").toString();
        String[] paths = splitPath(filePath);
        File directoryOriginal=new File("\\\\ptrisf02\\\\group2\\Engine_Follow\\"+paths[1]+"\\"+paths[2]+"\\"+paths[3]);
        File directoryTemp=new File("T:\\Temp\\"+salesOrder);
        if(!directoryTemp.exists())
        {
            directoryTemp.mkdir();
        }
        else
        {
            System.out.println("Folder already created...");
        }
        FileUtils.copyDirectoryToDirectory(directoryOriginal, directoryTemp);
        //copyDirectory(directoryOriginal, directoryTemp);
        System.out.println("Copying completed...");
    } catch (SolrServerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public static String[] splitPath(String pathString) {
    Path path = Paths.get(pathString);
    return StreamSupport.stream(path.spliterator(), false).map(Path::toString)
                        .toArray(String[]::new);
}

当我尝试复制文件夹时,它给我这个错误

java.io.IOException: Failed to list contents of \\ptrisf02\group2\Engine_Follow\V2500-A5\V2500-A5_e-Archive\EV12386-03
    at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1426)
    at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1388)
    at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1268)
    at org.apache.commons.io.FileUtils.copyDirectoryToDirectory(FileUtils.java:1209)
    at org.solr.copyAllSO.doPost(copyAllSO.java:81)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

那么,这里的问题是什么?源文件夹中有几个子文件夹会造成问题吗?

1 个答案:

答案 0 :(得分:0)

请勿使用FileUtils。这是使用古老的java.io.File类的旧代码,这就是为什么它给您这样模糊的错误的原因。

使用java.nio.file包复制目录比您想象的要容易:

Path sourceRoot = directoryOriginal.toPath();
Path destRoot = directoryTemp.toPath();

try (Stream<Path> tree = Files.walk(sourceRoot)) {
    Iterator<Path> i = tree.iterator();
    while (i.hasNext()) {
        Path source = i.next();
        Path dest = destRoot.resolve(sourceRoot.relativize(source));
        if (Files.isDirectory(source)) {
            Files.createDirectories(dest);
        } else {
            Files.copy(source, dest);
        }
    }
}

与File类的方法不同,java.nio.file.Files方法将成功或失败,但有一个明确的消息(通常从底层操作系统获得)的异常说明失败的原因。< / p>