Sir. Hedgehog
Sir. Hedgehog

Reputation: 1290

How to duplicate a file given a different name in the same directory in windows

I have been trying to duplicate a file but change the name of it in the same windows directory but I got not luck.

I cant just copy the file in the same directory because of the windows rule that two files cannot have the same name in the same directory.

I am not allowed to copy it to another directory then rename it, and then move it back in the same directory.

And I don't see any helpful implementation in the File.class.

Tried something like that but it didnt work:

File file = new File(filePath);
File copiedFile = new File(filePath);
//then rename the copiedFile and then try to copy it
Files.copy(file, copiedFile);

Upvotes: 1

Views: 5219

Answers (3)

runefist
runefist

Reputation: 613

@Pierre his code is perfect, however this is what I use so I won't be able to change the extension:

public static void copyWithDifferentName(File sourceFile, String newFileName) {
    if (sourceFile == null || newFileName == null || newFileName.isEmpty()) {
        return;
    }
    String extension = "";
    if (sourceFile.getName().split("\\.").length > 1) {
        extension = sourceFile.getName().split("\\.")[sourceFile.getName().split("\\.").length - 1];
    }
    String path = sourceFile.getAbsolutePath();
    String newPath = path.substring(0, path.length() - sourceFile.getName().length()) + newFileName;
    if (!extension.isEmpty()) {
        newPath += "." + extension;
    }
    try (OutputStream out = new FileOutputStream(newPath)) {
        Files.copy(sourceFile.toPath(), out);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Upvotes: 1

Joop Eggen
Joop Eggen

Reputation: 109557

An initial attempt would be using Path as suitable:

Path file = Paths.get(filePath);
String name = file.getFileName().toString();
String copiedName = name.replaceFirst("(\\.[^\\.]*)?$", "-copy$0");
Path copiedFile = file.resolveSibling(copiedName);
try {
    Files.copy(file, copiedFile);
} catch (IOException ex) {
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

Upvotes: 2

Pierre
Pierre

Reputation: 163

You could create a new file in the same directory and then just copy the contents of the original file to the duplicate See: Java read from one file and write into another file using methods For more info

you can also use this snippet from https://www.journaldev.com/861/java-copy-file

private static void copyFileUsingStream(File source, File dest) throws IOException {
    InputStream is = null;
    OutputStream os = null;
    try {
        is = new FileInputStream(source);
        os = new FileOutputStream(dest);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    } finally {
        is.close();
        os.close();
    }
}

Upvotes: 2

Related Questions