Java:将包含文件和目录的目录移动到新路径

时间:2014-04-28 16:58:38

标签: java file unix

我有一个包含一些文件的目录和包含更多文件的子目录。

Folder -  Directory (path -> /home/abc/xyz/Folder)
  ->Abc.txt  (file)
  -> Xyz.zip (file)
  -> Address (Sub Directory)
         -> PWZ.log (file)
         -> CyZ.xml (file)
  -> DataLog.7zip

我要做的是将这个完整的目录从一个路径移动到另一个路径,包括所有文件和子文件夹(及其文件)。

即移动此"文件夹"从/ home / abc / xyz /文件夹到/ home / abc / subdir / Folder。

Java是否提供了基于FOLDER目录执行此任务的任何API,还是我们需要将每个文件递归复制到此路径?

8 个答案:

答案 0 :(得分:10)

您只需使用

移动目录即可
import static java.nio.file.StandardCopyOption.*;

Files.move(new File("C:\\projects\\test").toPath(), new File("C:\\projects\\dirTest").toPath(), StandardCopyOption.REPLACE_EXISTING);

更改来源和目的地路径

请参阅here以获取更多详情

另请参阅API

 When invoked to move a
     * directory that is not empty then the directory is moved if it does not
     * require moving the entries in the directory.  For example, renaming a
     * directory on the same {@link FileStore} will usually not require moving
     * the entries in the directory. When moving a directory requires that its
     * entries be moved then this method fails (by throwing an {@code
     * IOException}). To move a <i>file tree</i> may involve copying rather
     * than moving directories and this can be done using the {@link
     * #copy copy} method in conjunction with the {@link
     * #walkFileTree Files.walkFileTree} utility method

如果您尝试在同一分区中移动文件,上面的代码就足够了(即使它有条目也可以移动目录)。如果不是(而不是移动)你需要使用递归作为其他答案提到。

答案 1 :(得分:7)

Files.move()将有效,前提是文件系统能够移动&#34;文件。这通常要求您移动到同一磁盘上的其他位置。

答案 2 :(得分:4)

最好的方法可能是递归方法,如: 这是我创建的用于将文件移动到临时文件夹的方法。

private boolean move(File sourceFile, File destFile)
{
    if (sourceFile.isDirectory())
    {
        for (File file : sourceFile.listFiles())
        {
            move(file, new File(file.getPath().substring("temp".length()+1)));
        }
    }
    else
    {
        try {
            Files.move(Paths.get(sourceFile.getPath()), Paths.get(destFile.getPath()), StandardCopyOption.REPLACE_EXISTING);
            return true;
        } catch (IOException e) {
            return false;
        }
    }
    return false;
}

答案 3 :(得分:2)

如果您已经导入了Apache Commons

FileUtils.moveDirectory(oldDir, newDir);

请注意,newDir不得预先存在。来自javadocs:

public static void moveDirectory(File srcDir,
                                 File destDir)
                      throws IOException
     

移动目录。   当目标目录位于另一个文件系统上时,请执行“复制和删除”。

     

参数:
  srcDir - 要移动的目录
  destDir - 目标目录

     

抛出:
  NullPointerException - 如果源或目标为空   FileExistsException - 如果目标目录存在   IOException - 如果源或目标无效
  IOException - 如果发生IO错误,则移动文件

答案 4 :(得分:0)

Java使用本地操作系统操作内置File.renameTo(File dest)

示例:

new File("/home/alik/Downloads/src").renameTo(new File("/home/alik/Downloads/target"))

答案 5 :(得分:0)

在确定目标路径中的目录已存在之后(例如,通过调用renameTo,只需使用File方法(已从JDK的mkdirs()类中提供) )。

答案 6 :(得分:0)

   private static void move(File sourceFile, File destFile) {
        if (sourceFile.isDirectory()) {
            File[] files = sourceFile.listFiles();
            assert files != null;
            for (File file : files) move(file, new File(destFile, file.getName()));
            if (!sourceFile.delete()) throw new RuntimeException();
        } else {
            if (!destFile.getParentFile().exists())
                if (!destFile.getParentFile().mkdirs()) throw new RuntimeException();
            if (!sourceFile.renameTo(destFile)) throw new RuntimeException();
        }
    }

为我工作

答案 7 :(得分:0)

public static void move(File srcDir, File destDir) throws IOException {
    FileUtils.copyDirectory(srcDir, destDir, true);
    if(srcDir.isDirectory()) {
        for(File file: srcDir.listFiles()) {
            FileUtils.forceDelete(file);
        }
    }
}

来自 org.apache.commons.io 包的 FileUtils;