Why
Why

Reputation: 15

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

I am trying to make a program that extracts multiple MP4 files from there individual folders and places them in a folder that is already created (code has been changed slightly so that it doesn't mess up any more of the MP4s, rather dummy text files).

I have managed to get so far as to list all folders/files in the specified folder however am having trouble moving them to a directory.

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());
}

The problem is when I go to move the file from the source folder to the target, it removes or converts the target.

screenshot

Upvotes: 1

Views: 553

Answers (1)

rzwitserloot
rzwitserloot

Reputation: 103018

Files.move isn't like the command line. You're programming. You have to spell things out. You're literally asking Files.move to make it so that target (here, G:\GoHere) will henceforth be the location for the file you are moving. If you intended: No, the target is G:\GoHere\TheSameFileName then you have to program this.

Separately, your code is a mess. Stop using java.io.File and java.nio.Path together. Pick a side (and pick the java.nio side, it's an newer API for a good reason), and do not mix and match.

For example:

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 gives you a Path object that is what you need here: The actual file in the target dir.

Upvotes: 2

Related Questions