/** * @param path to test * @return true if path is absolute */ static public boolean isAbsolutePath(String path) { return (path != null && path.length() > 0 && (path.charAt(0) == '/' || hasDriveLetter(path))); }
/** * Convert path to add a leading '/'; assumes canonical. * * @param path convert this path * @return absolute version */ static public String abspath(String path) { if(path == null) return "/"; StringBuilder b = new StringBuilder(path); canonicalpath(b); if(b.charAt(0) == '/') b.deleteCharAt(0); if(b.charAt(0) != '/' || !hasDriveLetter(b)) b.insert(0, '/'); return b.toString(); }
/** * Convert path to remove any leading '/' or drive letter assumes canonical. * * @param path convert this path * @return relatived version */ static public String relpath(String path) { if(path == null) return null; StringBuilder b = new StringBuilder(path); canonicalpath(b); if(b.length() > 0) { if(b.charAt(0) == '/') b.deleteCharAt(0); if(hasDriveLetter(b)) b.delete(0, 2); } return b.toString(); }
static public void canonicalpath(StringBuilder s) { if(s == null || s.length() == 0) return; int index = 0; // "\\" -> "/" for(; ; ) { index = s.indexOf("\\", index); if(index < 0) break; s.replace(index, index + 1, "/"); } boolean isabs = (s.charAt(0) == '/'); // remember for(; ; ) { // kill any leading '/'s if(s.length() == 0 || s.charAt(0) != '/') break; s.deleteCharAt(0); } // Do we have drive letter? boolean hasdrive = hasDriveLetter(s); if(hasdrive) s.setCharAt(0, Character.toLowerCase(s.charAt(0))); while(s.length() > 0 && s.charAt(s.length() - 1) == '/') { s.deleteCharAt(s.length() - 1); // kill any trailing '/'s } // Add back leading '/', if any if(!hasdrive && isabs) s.insert(0, '/'); }