You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by je...@apache.org on 2004/03/12 22:58:59 UTC

cvs commit: jakarta-commons/io/src/java/org/apache/commons/io FilenameUtils.java

jeremias    2004/03/12 13:58:59

  Modified:    io/src/java/org/apache/commons/io FilenameUtils.java
  Log:
  Bugzilla #27612
  Fix for catPath not handling Windows-style path separators.
  Submitted by: Maarten Coene <Maarten.Coene.at.qmedit.com>
  
  Revision  Changes    Path
  1.8       +33 -10    jakarta-commons/io/src/java/org/apache/commons/io/FilenameUtils.java
  
  Index: FilenameUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/io/src/java/org/apache/commons/io/FilenameUtils.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- FilenameUtils.java	23 Feb 2004 04:35:59 -0000	1.7
  +++ FilenameUtils.java	12 Mar 2004 21:58:59 -0000	1.8
  @@ -263,38 +263,61 @@
       }
   
       /**
  -     * Will concatenate 2 paths.  Paths with <code>..</code> will be
  -     * properly handled.
  -     * <p>Eg.,<br />
  +     * Will concatenate 2 paths. Paths with <code>..</code> will be
  +     * properly handled. The path separator between the 2 paths is the 
  +     * system default path separator.
  +     *
  +     * <p>Eg. on UNIX,<br />
        * <code>/a/b/c</code> + <code>d</code> = <code>/a/b/d</code><br />
        * <code>/a/b/c</code> + <code>../d</code> = <code>/a/d</code><br />
        * </p>
        *
  +     * <p>Eg. on Microsoft Windows,<br />
  +     * <code>C:\a\b\c</code> + <code>d</code> = <code>C:\a\b\d</code><br />
  +     * <code>C:\a\b\c</code> + <code>..\d</code> = <code>C:\a\d</code><br />
  +     * <code>/a/b/c</code> + <code>d</code> = <code>/a/b\d</code><br />
  +     * </p>
  +     *
        * Thieved from Tomcat sources...
        *
  +     * @param lookupPath the base path to attach to
  +     * @param path path the second path to attach to the first
        * @return The concatenated paths, or null if error occurs
        */
       public static String catPath( String lookupPath, String path) {
           // Cut off the last slash and everything beyond
  -        int index = lookupPath.lastIndexOf("/");
  +        int index = indexOfLastPathSeparator(lookupPath);
           String lookup = lookupPath.substring(0, index);
           String pth = path;
   
           // Deal with .. by chopping dirs off the lookup path
  -        while (pth.startsWith("../")) {
  +        while (pth.startsWith("../") || pth.startsWith("..\\")) {
               if (lookup.length() > 0) {
  -                index = lookup.lastIndexOf("/");
  +                index = indexOfLastPathSeparator(lookup);
                   lookup = lookup.substring(0, index);
               } else {
                   // More ..'s than dirs, return null
                   return null;
               }
   
  -            index = pth.indexOf("../") + 3;
  -            pth = pth.substring(index);
  +            pth = pth.substring(3);
           }
   
  -        return new StringBuffer(lookup).append("/").append(pth).toString();
  +        return new StringBuffer(lookup).append(File.separator).append(pth).toString();
  +    }
  +    
  +    /**
  +     * Return the index of the last 'path separator' character. The 'path separator'
  +     * character is '/' for UNIX systems and '\' for Microsoft Windows systems.
  +     * 
  +     * @param path The path to find the last path separator in
  +     * @return The index of the last 'path separator' character, or -1 if there
  +     * is no such character.
  +     */
  +    public static int indexOfLastPathSeparator(String path) {
  +        int lastUnixPos = path.lastIndexOf('/');
  +        int lastWindowsPos = path.lastIndexOf('\\');
  +        return Math.max(lastUnixPos, lastWindowsPos);
       }
   
       /**
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org