Categories
virtualization

java实现move操作

java实现move操作

这类操作与文件所在的文件系统息息相关.

File的renameTo一般只用于同级目录修改文件名。

想要多级目录移动文件还得用Files.move方法。

同一个文件系统下会进行move操作

不同文件系统,则通过拷贝-删除的方式实现move。

package io.move;

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

/**
 * move-test<br/>
 * ├── dir1<br/>
 * │   └── child<br/>
 * │       └── hui3<br/>
 * └── hui1<br/>
 * <p>
 * move-test<br/>
 * ├── dir1<br/>
 * │   └── child<br/>
 * │       └── hui3<br/>
 * └── hui2<br/>
 */
public class MoveTest {
    public static void main(String[] args) {

        String root = "/Users/ephuizi/move-test";

        Path test1 = Paths.get(root, "hui1");
        Path test2 = Paths.get(root, "hui2");

        File test1File = test1.toFile();
        File test2File = test2.toFile();
        //同文件系统,同级目录下,文件重命名
        test1File.renameTo(test2File);

        Path test3 = Paths.get(root, "dir1");
        Path test4 = Paths.get(root, "dir2");

        try {
            //多级目录下文件move
            mvoeDir(test3.toFile(), test4.toFile());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void mvoeDir(File from, File to) throws IOException {

        File[] children = from.listFiles();
        for (File child : children) {
            Path target = Paths.get(to.getPath(), child.getPath().substring(from.getPath().length()));
            if (child.isDirectory()) {
                File targetFile = target.toFile();
                if (!targetFile.exists()) {
                    Files.move(child.toPath(), target);
                } else {
                    if (targetFile.isFile()) {
                        targetFile.delete();
                    }
                    mvoeDir(child, targetFile);
                }
            } else if (child.isFile()) {
                //
                Files.move(child.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }

    private static void delDir(File dir) {
        File[] children = dir.listFiles();
        for (File child : children) {
            if (child.isDirectory())
                delDir(child);
            else
                child.delete();
        }
    }
}