Java tutorial
//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; } }