package co.codewizards.cloudstore.core.oio; import java.io.File; import java.util.ArrayList; import java.util.StringTokenizer; public final class IoFileRelativePathUtil { private static final boolean LIKE_JAVA_NIO_PATH_RELATIVIZE = true; private IoFileRelativePathUtil() { } static String getRelativePath(final File from, final File to) { return getRelativePath(from, to, File.separatorChar); } static String getRelativePath(final File from, final File to, final char separatorChar) { final String fromPath = from.getAbsolutePath(); final String toPath = to.getAbsolutePath(); final boolean isDirectory = from.isDirectory(); return getRelativePath(fromPath, toPath, isDirectory, separatorChar); } static String getRelativePath(final String fromPath, final String toPath, boolean isFromPathDirectory, final char separatorChar) { isFromPathDirectory = LIKE_JAVA_NIO_PATH_RELATIVIZE || isFromPathDirectory; //from observation, left for explanation final ArrayList<String> fromPathSegments = splitPath(fromPath); final ArrayList<String> toPathSegments = splitPath(toPath); while (!fromPathSegments.isEmpty() && !toPathSegments.isEmpty()) { if (!(fromPathSegments.get(0).equals(toPathSegments.get(0)))) { break; } fromPathSegments.remove(0); toPathSegments.remove(0); } final StringBuffer sb = new StringBuffer(); for (int i = 0; i < fromPathSegments.size() - (isFromPathDirectory ? 0 : 1); i++) { sb.append(".."); sb.append(separatorChar); } for (final String s : toPathSegments) { sb.append(s); sb.append(separatorChar); } return sb.substring(0, sb.length() - 1); } private static ArrayList<String> splitPath(final String path) { final ArrayList<String> pathSegments = new ArrayList<String>(); final StringTokenizer st = new StringTokenizer(path, File.separator); while (st.hasMoreTokens()) { final String token = st.nextToken(); if (token.equals(".")) { // skip } else if (token.equals("..")) { if (!pathSegments.isEmpty()) { pathSegments.remove(pathSegments.size() - 1); } } else { pathSegments.add(token); } } return pathSegments; } }