使用 Files.move 创建新的 "file" 文件类型而不是将文件移动到目录

Using the Files.move creates a new "file" file type rather than moving the file to a directory

我正在尝试制作一个程序,从那里的各个文件夹中提取多个 MP4 文件,并将它们放在一个已经创建的文件夹中(代码已略有更改,因此它不会再弄乱任何 MP4 文件,而不是虚拟文本文件)。

我已经设法列出了指定文件夹中的所有 folders/files,但是我无法将它们移动到目录。

static File dir = new File("G:\New Folder");
static Path source;
static Path target = Paths.get("G:\gohere");

static void showFiles(File files[]) {
    for (File file : files) { // Loops through each file in the specified directory in "dir" variable.

        if (file.isDirectory()) { // If the file is a directory.

            File[] subDir = file.listFiles(); // Store each file in a File list.

            for (File subFiles : subDir) { // Loops through the files in the sub-directory.
                if (subFiles.getName().endsWith(".mp4")) { // if the file is of type MP4
                    source = subFiles.toPath(); // Set source to be the abs path to the file.
                    System.out.println(source);
                    try {
                        Files.move(source, target);
                        System.out.println("File Moved");
                    } catch (IOException e) {
                        e.getMessage();
                    }
                }
            }
        } else {
            source = file.toPath(); // abs path to file
            try {
                Files.move(source, target);
                System.out.println("File moved - " + file.getName());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args) {
    showFiles(dir.listFiles());
}

问题是当我将文件从源文件夹移动到目标文件夹时,它会删除或转换目标文件夹。

Files.move 不像命令行。你在编程。你必须把事情说清楚。您实际上是在要求 Files.move 这样做,以便 target(此处为 G:\GoHere)从此成为您要移动的文件的位置。如果您打算:不,目标是 G:\GoHere\TheSameFileName 那么您必须对此进行编程。

另外,您的代码一团糟。停止同时使用 java.io.Filejava.nio.Path。选择一方(选择 java.nio 一方,这是一个较新的 API 有充分理由的),不要混搭。

例如:

Path fromDir = Paths.get("G:\FromHere");
Path targetDir = Paths.get(G:\ToHere");
try (DirectoryStream ds = Files.newDirectoryStream(fromDir)) {
  for (Path child : ds) {
    if (Files.isRegularFile(child)) {
      Path targetFile = targetDir.resolve(child.getFileName());
      Files.move(child, targetFile);
    }
  }
}

resolve 给你一个 Path 对象,这是你在这里需要的:目标目录中的实际文件。