rakesh_parashar
rakesh_parashar

Reputation: 829

How to dynamically update absolute path

Given the below incoming path, e.g.

C:\cresttest\parent_3\child_3_1\child_3_1_.txt

How can one update and add new dir in between above path to construct below result

C:\cresttest\NEW_PATH\parent_3\child_3_1\child_3_1_.txt

Currently I am using multiple subString to identify the incoming path, but incoming path are random and dynamic. Using substring and placing my new path requires more line of code or unnecessary processing, is there any API or way to easily update and add my new dir in between the absolute path?

Upvotes: 3

Views: 589

Answers (4)

Chris Shaw
Chris Shaw

Reputation: 13

Just for fun, not sure whether this is what you wanted

public static String addFolderToPath(String originalPath, String newFolderName, int position){
    String returnString = "";
    String[] pathArray = originalPath.split("\\\\");

    for(int i = 0; i<pathArray.length; i++){
        returnString = returnString.concat(i==position ? "\\" + newFolderName : "");
        returnString = returnString.concat(i!=0 ? "\\" + pathArray[i] : "" + pathArray[i]);

    }
    return returnString;  
}

Call:

System.out.println(addFolderToPath("c:\\abc\\def\\ghi\\jkl", "test", 1));
System.out.println(addFolderToPath("c:\\abc\\def\\ghi\\jkl", "test", 2));
System.out.println(addFolderToPath("c:\\abc\\def\\ghi\\jkl", "test", 3));
System.out.println(addFolderToPath("c:\\abc\\def\\ghi\\jkl", "test", 4));

Run:

c:\test\abc\def\ghi\jkl
c:\abc\test\def\ghi\jkl
c:\abc\def\test\ghi\jkl
c:\abc\def\ghi\test\jkl

Upvotes: 0

Bohemian
Bohemian

Reputation: 425318

You can use this simple regex replace:

path = path.replaceAll(":.\\w+", "$0\\\\NEW_PATH");

Your code would be simpler if you used / instead of \ for your path delimiters. eg, compare:

String path = "C:\\cresttest\\parent_3\\child_3_1\\child_3_1_.txt";
path = path.replaceAll(":.\\w+", "$0\\\\NEW_PATH");

with

String path = "C:/cresttest/parent_3.child_3_1/child_3_1_.txt";
path = path.replaceAll(":.\\w+", "$0/NEW_PATH");

Java can handle either delimiter on windows, but on linux only / works, so to make your code portable and more readable, prefer using /.

Upvotes: 0

Holger
Holger

Reputation: 298539

You may simply insert a path at the second backslash like this:

String path="C:\\cresttest\\parent_3\\child_3_1\\child_3_1_.txt";

final String slash="\\\\";
path=path.replaceFirst(slash+"[^"+slash+"]+"+slash, "$0NEW_PATH"+slash);

System.out.println(path);

Demo

This replaces the first occurrence of \\arbitrarydirname\\ with itself (referred to via $0) followed by NEWPATH\\.

The separator’s source code representation looks a bit odd ("\\\\") as a backslash has to be escaped twice when writing regular expression in a Java String literal.

If you want your operation to be platform independent, you may replace that line with

final String slash = Pattern.quote(FileSystems.getDefault().getSeparator());

Of course, then, the input path must be in the right format for the platform as well.

Upvotes: 1

leroydev
leroydev

Reputation: 2955

By using java.nio.file.Path, you could to the following:

Path incomingPath = Paths.get("C:\\cresttest\\parent_3\\child_3_1\\child_3_1_.txt");
//getting C:\cresttest\, adding NEW_PATH to it
Path subPathWithAddition = incomingPath.subpath(0, 2).resolve("NEW_PATH");
//Concatenating C:\cresttest\NEW_PATH\ with \parent_3\child_3_1\child_3_1_.txt
Path finalPath = subPathWithAddition.resolve(incomingPath.subpath(2, incomingPath.getNameCount()));

You could then get the path URI by calling finalPath.toUri()

Note: this doesn't depend on any names in your path, it depends on the directory depth though, which you could edit in the subpath calls.

Note 2: you could probably reduce the amount of Path instances you make to one, I made three to improve readability.

Upvotes: 4

Related Questions