原文地址:http://www.cnblogs.com/liaoyu/p/uudisk.html
源码地址:https://github.com/liaoyu/uudisk
前段时间为是练习JQuery和Java遍历目录,写了一个JavaWeb(使用Jsp+Servlet)的例子。源码是Myeclipse新建的项目,需要配置一些环境,比如JRE路径,以下是运行截图,界面模仿新浪微盘。
工作原理就是通过Java遍历系统(Windows)的目录,前台通过点击图标以ajax方式触发事件,后台以json数据的形式把文件结构返回给前台,前台通过JS解析JSON数据内容,展示不同的图片。目前尚存在的问题有无法显示C盘目录下的文件。
下面贴出其中核心的代码,即遍历目录的工具类IterateDir.java
package com.uudisk.utils; import java.io.File; import java.io.FileInputStream; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import com.uudisk.domain.DirBean; import com.uudisk.domain.FileBean; import com.uudisk.domain.RootBean; public class IterateDir { /* * 获取根目录信息 */ public static List<RootBean> getDiskInfo(){ //获取盘符 File []files=File.listRoots(); List<RootBean>roots=new ArrayList<RootBean>(); for(File file:files){ if(file.getTotalSpace()!=0){ RootBean rootBean=new RootBean(); rootBean.setDiskPath(file.getAbsolutePath()); rootBean.setDiskName(file.getAbsolutePath().charAt(0)+""); rootBean.setDiskSize(FormetFileSize(file.getTotalSpace())); rootBean.setAvilableSize(FormetFileSize(file.getFreeSpace())); roots.add(rootBean); } } return roots; } /* * 通过递归得到某一路径下所有的目录及其文件 */ public static DirBean getFiles(String dirPath) throws Exception{ File root = new File(dirPath); DirBean dirBean=null; if(root.exists()){ dirBean=new DirBean(); String dirSize=""; int dirCount=0; List<FileBean> filelist=new LinkedList<FileBean>(); if(root.isDirectory()){ File[] files = root.listFiles(); for (File file : files) { FileBean fileBean=new FileBean(); String realPath=file.getAbsolutePath(); fileBean.setFilePath(realPath); fileBean.setFileName(getFileName(realPath)); if (file.isDirectory()) { fileBean.setFileType("DIR"); //fileBean.setFileSize(FormetFileSize(getFileSize(file))); fileBean.setFileSize(""); }else{ fileBean.setFileType(getFileType(getFileName(realPath))); fileBean.setFileSize(FormetFileSize(getFileSizes(file))); } filelist.add(fileBean); } }else{ dirSize=FormetFileSize(getFileSizes(root)); } dirBean.setDirCount(dirCount); dirBean.setDirSize(dirSize); dirBean.setDirPath(dirPath); dirBean.setFiles(filelist); }else{ System.out.println("文件或文件目录不存在"); } return dirBean; } private static String getFileType(String fileName) { return fileName.substring(fileName.lastIndexOf(".")+1).toUpperCase(); } //获取文件名 static String getFileName(String filePath) { String [] fileItems=filePath.split("\\\\"); return fileItems[fileItems.length-1]; } //取得文件大小 public static long getFileSizes(File f) throws Exception{ long s=0; if (f.exists()) { FileInputStream fis = null; fis = new FileInputStream(f); s= fis.available(); } else { System.out.println("文件不存在"); } return s; } //取得文件夹大小 public static long getFileSize(File f)throws Exception { long size = 0; File flist[] = f.listFiles(); for (int i = 0; i < flist.length; i++) { if (flist[i].isDirectory()) { size = size + getFileSize(flist[i]); } else { size = size + flist[i].length(); } } return size; } public static String FormetFileSize(long fileS) {//转换文件大小 DecimalFormat df = new DecimalFormat("#.00"); String fileSizeString = ""; if (fileS < 1024) { fileSizeString = df.format((double) fileS) + "B"; } else if (fileS < 1048576) { fileSizeString = df.format((double) fileS / 1024) + "KB"; } else if (fileS < 1073741824) { fileSizeString = df.format((double) fileS / 1048576) + "M"; } else { fileSizeString = df.format((double) fileS / 1073741824) + "G"; } return fileSizeString; } public static long getlist(File f){//递归求取目录文件个数 long size = 0; File flist[] = f.listFiles(); size=flist.length; for (int i = 0; i < flist.length; i++) { if (flist[i].isDirectory()) { size = size + getlist(flist[i]); size--; } } return size; } }