Here you can find the source of getRelativePath(File fromFile, File toFile)
Parameter | Description |
---|---|
fromFile | the <code>File</code> to calculate the path from |
toFile | the <code>File</code> to calculate the path to |
Parameter | Description |
---|---|
Exception | for undocumented reasons |
public static String getRelativePath(File fromFile, File toFile) throws Exception
//package com.java2s; /*//from w w w. j a v a 2s . c om * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; public class Main { /** * Calculates the relative path between two files. * <p> * Implementation note:<br/> This function may throw an IOException if an I/O error occurs * because its use of the canonical pathname may require filesystem queries. * </p> * * @param fromFile the <code>File</code> to calculate the path from * @param toFile the <code>File</code> to calculate the path to * @return the relative path between the files * @throws Exception for undocumented reasons * @see File#getCanonicalPath() * @since Ant 1.7 */ public static String getRelativePath(File fromFile, File toFile) throws Exception { String fromPath = fromFile.getCanonicalPath(); String toPath = toFile.getCanonicalPath(); // build the path stack info to compare String[] fromPathStack = getPathStack(fromPath); String[] toPathStack = getPathStack(toPath); if (0 < toPathStack.length && 0 < fromPathStack.length) { if (!fromPathStack[0].equals(toPathStack[0])) { // not the same device (would be "" on Linux/Unix) return getPath(Arrays.asList(toPathStack)); } } else { // no comparison possible return getPath(Arrays.asList(toPathStack)); } int minLength = Math.min(fromPathStack.length, toPathStack.length); int same = 1; // Used outside the for loop // get index of parts which are equal for (; same < minLength && fromPathStack[same].equals(toPathStack[same]); same++) { // Do nothing } List relativePathStack = new ArrayList(); // if "from" part is longer, fill it up with ".." // to reach path which is equal to both paths for (int i = same; i < fromPathStack.length; i++) { relativePathStack.add(".."); } // fill it up path with parts which were not equal for (int i = same; i < toPathStack.length; i++) { relativePathStack.add(toPathStack[i]); } return getPath(relativePathStack); } /** * Gets all names of the path as an array of <code>String</code>s. * * @param path to get names from * @return <code>String</code>s, never <code>null</code> * @since Ant 1.7 */ public static String[] getPathStack(String path) { String normalizedPath = path.replace(File.separatorChar, '/'); return normalizedPath.split("/"); } /** * Gets path from a <code>List</code> of <code>String</code>s. * * @param pathStack <code>List</code> of <code>String</code>s to be concatenated as a path. * @return <code>String</code>, never <code>null</code> * @since Ant 1.7 */ public static String getPath(List pathStack) { // can safely use '/' because Windows understands '/' as separator return getPath(pathStack, '/'); } /** * Gets path from a <code>List</code> of <code>String</code>s. * * @param pathStack <code>List</code> of <code>String</code>s to be concated as a path. * @param separatorChar <code>char</code> to be used as separator between names in path * @return <code>String</code>, never <code>null</code> * @since Ant 1.7 */ public static String getPath(final List pathStack, final char separatorChar) { final StringBuffer buffer = new StringBuffer(); final Iterator iter = pathStack.iterator(); if (iter.hasNext()) { buffer.append(iter.next()); } while (iter.hasNext()) { buffer.append(separatorChar); buffer.append(iter.next()); } return buffer.toString(); } }