1

我正在尝试强制移动目录,这意味着如果已经存在,则无需询问即可覆盖。

代码 :

import java.io.IOException;
import java.lang.System;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class MoveDirectory {


    private static void movefilesandfolder(String sourceFilevar,String  destinationFilevar)
    {

                System.out.println("source="+sourceFilevar);
                System.out.println("destination="+destinationFilevar);

                Path sourceFile=Paths.get(sourceFilevar);
                Path destinationFile=Paths.get(destinationFilevar);

                try {

                        Files.move(sourceFile, destinationFile,StandardCopyOption.REPLACE_EXISTING);

                    } catch (IOException e) {
                        // TODO Auto-generated catch block

                        e.printStackTrace();
                    }
    }

    /**
     * Sole entry point to the class and application.
     * @param args Array of String arguments.
     */
    public static void main(String[] args) {
       movefilesandfolder("C:\\FTPDownload\\Downloaded\\epi141225_0001","C:\\FTPDownload\\In_Progress\\epi141225_0001");
    }
}

错误输出:

source=C:\FTPDownload\Downloaded\epi141225_0001
destination=C:\FTPDownload\In_Progress\epi141225_0001
java.nio.file.DirectoryNotEmptyException: C:\FTPDownload\In_Progress\epi141225_0001
    at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:372)
    at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:286)
    at java.nio.file.Files.move(Files.java:1345)
    at MoveDirectory.movefilesandfolder(MoveDirectory.java:22)
    at MoveDirectory.main(MoveDirectory.java:36)

如果文件夹不存在于目标路径上,则此代码有效,但如果已存在则失败。即使目标路径上存在空文件夹,此代码也不起作用。

Files.move(sourceFile, destinationFile,StandardCopyOption.REPLACE_EXISTING);

在此调用选项中,我使用的不适用于文件夹。此代码已针对文件进行了测试,它也适用于已存在的文件。

但我想移动/覆盖文件夹。

4

3 回答 3

1

您可以在移动之前删除目标目录,或者,如果要将目录合并在一起,请循环目录文件并将任何人移动到新文件夹中

System.out.println("source="+sourceFilevar);
                System.out.println("destination="+destinationFilevar);

                Path sourceFile=Paths.get(sourceFilevar);
                Path destinationFile=Paths.get(destinationFilevar);

                try {
                        if(new File(destinationFile).exists()){
                              // DELETE DIRECTORY
                        }
                        Files.move(sourceFile, destinationFile,StandardCopyOption.REPLACE_EXISTING);

                    } catch (IOException e) {
                        // TODO Auto-generated catch block

                        e.printStackTrace();
                    }

或者

    System.out.println("source="+sourceFilevar);
                    System.out.println("destination="+destinationFilevar);

                    Path sourceFile=Paths.get(sourceFilevar);
                    Path destinationFile=Paths.get(destinationFilevar);

                    try {
                            if(new File(destinationFile).exists()){
                                  // for each file in sourceFile
                                  //     Files.move file ...
                            }else{
                            Files.move(sourceFile, destinationFile,StandardCopyOption.REPLACE_EXISTING);
                           }

                        } catch (IOException e) {
                            // TODO Auto-generated catch block

                            e.printStackTrace();
                        }
于 2015-03-04T09:32:10.727 回答
0

文档:

public static Path move(Path source,
                        Path target,
                        CopyOption... options)
             throws IOException

将文件移动或重命名为目标文件。

默认情况下,此方法尝试将文件移动到目标文件,如果目标文件存在则失败,除非源和目标是同一个文件,在这种情况下,此方法无效。如果文件是符号链接,则移动符号链接本身,而不是链接的目标。可以调用此方法来移动一个空目录。

于 2015-03-04T09:31:41.513 回答
0

您可以尝试使用Path.resolve(other Path)这样的方法

Files.move(sourceFile, destinationFile.resolve(Paths.get(sourceFile).getFileName()), StandardCopyOption.REPLACE_EXISTING)

Java 文档,对此给出最好的解释。

于 2019-05-06T06:35:15.950 回答