package org.theonefx.wcframework.utils;
import java.io.File;
import java.io.FileFilter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
/**
* 磁盘操作的帮助函数集合
*/
public abstract class DiskUtils {
/**
* 一个 Vistor 模式的目录深层遍历
*
* @param f 要遍历的目录或者文件,如果是目录,深层遍历,否则,只访问一次文件
* @param fv 对文件要进行的操作
* @param filter 遍历目录时,哪些文件应该被忽略
* @return 遍历的文件个数
*/
public static int visitFile(File f, FileVisitor fv, FileFilter filter) {
int re = 0;
if (f.isFile()) {
fv.visit(f);
re++;
} else if (f.isDirectory()) {
File[] fs = null == filter ? f.listFiles() : f.listFiles(filter);
for (File theFile : fs)
re += visitFile(theFile, fv, filter);
}
return re;
}
/**
* @return 当前账户的主目录全路径
*/
public static String home() {
return System.getProperty("user.home");
}
/**
* @param path
* 相对用户主目录的路径
* @return 相对用户主目录的全路径
*/
public static String home(String path) {
return home() + path;
}
/**
* 获取一个路径的绝对路径
*
* @param path
* 路径
* @return 绝对路径
*/
public static String absolute(String path) {
return absolute(path, DiskUtils.class.getClassLoader(), "UTF-8");
}
/**
* 获取一个路径的绝对路径
*
* @param path
* 路径
* @param klassLoader
* 参考 ClassLoader
* @param enc
* 路径编码方式
* @return 绝对路径
*/
public static String absolute(String path, ClassLoader klassLoader, String enc) {
path = normalize(path, enc);
if (StringUtils.isEmpty(path))
return null;
File f = new File(path);
if (!f.exists()) {
URL url = null;
try {
url = klassLoader.getResource(path);
if (null == url)
url = Thread.currentThread().getContextClassLoader().getResource(path);
if (null == url)
url = ClassLoader.getSystemResource(path);
}
catch (Throwable e) {}
if (null != url)
return normalize(url.getPath(), "UTF-8");// 通过URL获取String,一律使用UTF-8编码进行解码
return null;
}
return path;
}
/**
* 让路径变成正常路径,将 ~ 替换成用户主目录
*
* @param path
* 路径
* @return 正常化后的路径
*/
public static String normalize(String path) {
return normalize(path, "UTF-8");
}
/**
* 让路径变成正常路径,将 ~ 替换成用户主目录
*
* @param path
* 路径
* @param enc
* 路径编码方式
* @return 正常化后的路径
*/
public static String normalize(String path, String enc) {
if (StringUtils.isEmpty(path))
return null;
if (path.charAt(0) == '~')
path = DiskUtils.home() + path.substring(1);
try {
return URLDecoder.decode(path, enc);
}
catch (UnsupportedEncodingException e) {
return null;
}
}
/**
* 整理路径。 将会合并路径中的 ".."
*
* @param path
* 路径
* @return 整理后的路径
*/
public static String getCanonicalPath(String path) {
if (StringUtils.isBlank(path))
return path;
String[] pa = StringUtils.splitIgnoreBlank(path, "[\\\\/]");
LinkedList<String> paths = new LinkedList<String>();
for (String s : pa) {
if ("..".equals(s)) {
if (paths.size() > 0)
paths.removeLast();
continue;
} else {
paths.add(s);
}
}
if (path.charAt(0) == '/')
return concat("/", paths).insert(0, '/').toString();
return concat("/", paths).toString();
}
private static <T> StringBuilder concat(Object c, Collection<T> coll) {
StringBuilder sb = new StringBuilder();
if (null == coll || coll.isEmpty())
return sb;
Iterator<T> it = coll.iterator();
sb.append(it.next());
while (it.hasNext())
sb.append(c).append(it.next());
return sb;
}
}