Get relative Path
//package xcordion.util;
import java.io.File;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class FileUtils {
static public String relativePath(File from, File to) {
return relativePath(from, to, File.separatorChar);
}
static public String relativePath(File from, File to, char separatorChar) {
String fromPath = from.getAbsolutePath();
String toPath = to.getAbsolutePath();
boolean isDirectory = from.isDirectory();
return relativePath(fromPath, toPath, isDirectory, separatorChar);
}
public static String relativePath(String fromPath, String toPath,
boolean fromIsDirectory, char separatorChar) {
ArrayList<String> fromElements = splitPath(fromPath);
ArrayList<String> toElements = splitPath(toPath);
while (!fromElements.isEmpty() && !toElements.isEmpty()) {
if (!(fromElements.get(0).equals(toElements.get(0)))) {
break;
}
fromElements.remove(0);
toElements.remove(0);
}
StringBuffer result = new StringBuffer();
for (int i = 0; i < fromElements.size() - (fromIsDirectory ? 0 : 1); i++) {
result.append("..");
result.append(separatorChar);
}
for (String s : toElements) {
result.append(s);
result.append(separatorChar);
}
return result.substring(0, result.length() - 1);
}
private static ArrayList<String> splitPath(String path) {
ArrayList<String> pathElements = new ArrayList<String>();
for (StringTokenizer st = new StringTokenizer(path, File.separator); st
.hasMoreTokens();) {
String token = st.nextToken();
if (token.equals(".")) {
// do nothing
} else if (token.equals("..")) {
if (!pathElements.isEmpty()) {
pathElements.remove(pathElements.size() - 1);
}
} else {
pathElements.add(token);
}
}
return pathElements;
}
}
Related examples in the same category