最近项目中要做一个统计功能,在指定一个文件夹后能够统计出这个文件夹下所有子文件的详细信息,包括文件名、子文件数、文件大小、是否文件夹、最后修改时间、下载地址,代码如下:
1、Service代码
/**
* 文件统计(所有子文件的文件名、子文件数、文件大小、是否文件夹、最后修改时间、下载地址)
*
* @param parentDir
* @return com.openailab.oascloud.common.model.ResponseResult
* @author zxzhang
* @date 2020/3/10
*/
public ResponseResult resourceStatistic(String parentDir) throws Exception {
Integer count = 0;
File dirFile = new File(bootstrapConfig.getDeviceRoot() + parentDir);
List<ResourceStatisticBO> resourceStatisticBOList = Lists.newArrayList();
if (dirFile.isDirectory()) {
File[] fileArr = dirFile.listFiles();
for (int i = 0; i < fileArr.length; i++) {
ResourceStatisticBO resourceStatisticBO = new ResourceStatisticBO();
countNum(fileArr[i].getPath(), count);
resourceStatisticBO.setFileName(fileArr[i].getName());
resourceStatisticBO.setFileSize(fileArr[i].isDirectory() == true ? FormetFileSize(getDirSize(fileArr[i])) : FormetFileSize(getFileSize(fileArr[i])));
resourceStatisticBO.setIsDir(fileArr[i].isDirectory() == true ? 1 : 0);
resourceStatisticBO.setLastModifiedTime(transformTime(fileArr[i].lastModified()));
resourceStatisticBO.setDownloadUrl(fileArr[i].isFile() == true ? bootstrapConfig.getDeviceDownloadUrl() + parentDir + "/" + fileArr[i].getName() : "");
resourceStatisticBO.setSubFileNum(count);
resourceStatisticBOList.add(resourceStatisticBO);
count = 0;
}
} else {
return ResponseResult.fail("不是文件夹");
}
return ResponseResult.success(resourceStatisticBOList);
}
/**
* 将毫秒转格式化为日期
*
* @param millTime
* @return java.lang.String
* @author zxzhang
* @date 2020/3/10
*/
private String transformTime(long millTime) {
Date d = new Date(millTime);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(d);
}
/**
* 统计文件数量
*
* @param filePath
* @return void
* @author zxzhang
* @date 2020/3/10
*/
private void countNum(String filePath, Integer count) {
File dirFile = new File(filePath);
if (dirFile.isDirectory()) {
File[] fileArr = dirFile.listFiles();
for (int i = 0; i < fileArr.length; i++) {
count++;
}
}
}
/**
* 获取文件大小
*
* @param f
* @return long
* @author zxzhang
* @date 2020/3/10
*/
private long getFileSize(File f) throws Exception {
long s = 0;
if (f.exists()) {
FileInputStream fis = null;
fis = new FileInputStream(f);
s = fis.available();
} else {
f.createNewFile();
System.out.println("文件不存在");
}
return s;
}
/**
* 获取文件夹大小
*
* @param f
* @return
*/
private long getDirSize(File f) {
long size = 0;
File flist[] = f.listFiles();
for (int i = 0; i < flist.length; i++) {
if (flist[i].isDirectory()) {
size = size + getDirSize(flist[i]);
} else {
size = size + flist[i].length();
}
}
return size;
}
/**
* 转换文件大小
*
* @param fileSize
* @return
*/
private String FormetFileSize(long fileSize) {
DecimalFormat df = new DecimalFormat("#.0");
String fileSizeString = "";
if (fileSize == 0) {
return "0.0B";
}
if (fileSize < 1024) {
fileSizeString = df.format((double) fileSize) + "B";
} else if (fileSize < 1048576) {
fileSizeString = df.format((double) fileSize / 1024) + "K";
} else if (fileSize < 1073741824) {
fileSizeString = df.format((double) fileSize / 1048576) + "M";
} else {
fileSizeString = df.format((double) fileSize / 1073741824) + "G";
}
return fileSizeString;
}
2、ResponseResult
/**
* @Classname: com.openailab.oascloud.common.model.ResponseResult
* @Description: 统一返回结果
* @Author: zxzhang
* @Date: 2019/6/26
*/
@Component
public class ResponseResult implements Serializable {
private static final long serialVersionUID = 5836869421731990598L;
/**
* 状态描述
*/
@Getter
private String message;
/**
* 返回数据
*/
@Getter
private Object data;
/**
* 响应码
*/
@Getter
private int code;
/**
* 状态(0:失败、1:成功)
*/
@Getter
private int status;
/**
* 总条数
*/
@Getter
private Integer total;
public ResponseResult() {
}
public ResponseResult(int status, Object data) {
this.status = status;
this.data = data;
}
public ResponseResult(int status, String message, Object data) {
this.status = status;
this.message = message;
this.data = data;
}
public ResponseResult(String message, Object data, int code, int status) {
this.message = message;
this.data = data;
this.code = code;
this.status = status;
}
public ResponseResult(String message, Object data, int code, int status, Integer total) {
this.message = message;
this.data = data;
this.code = code;
this.status = status;
this.total = total;
}
public static ResponseResult fail(String msg) {
if (StringUtils.isEmpty(msg)) {
return new ResponseResult(ResponseEnum.RESPONSE_CODE_FAIL.getMsg(), null, ResponseEnum.RESPONSE_CODE_FAIL.getCode(), CommonConst.RESPONSE_FAIL);
} else {
return new ResponseResult(msg, null, ResponseEnum.RESPONSE_CODE_FAIL.getCode(), CommonConst.RESPONSE_FAIL);
}
}
public static ResponseResult fail(int code, String msg) {
return new ResponseResult(msg, null, code, CommonConst.RESPONSE_FAIL);
}
public static ResponseResult fail(ResponseEnum responseEnum, Object obj) {
return new ResponseResult(responseEnum.getMsg(), obj, responseEnum.getCode(), 0);
}
public static ResponseResult success(Object data) {
return new ResponseResult(ResponseEnum.RESPONSE_CODE_SUCCESS.getMsg(), data, ResponseEnum.RESPONSE_CODE_SUCCESS.getCode(), CommonConst.RESPONSE_SUCCESS);
}
public static ResponseResult success(Object data, int code, String message) {
return new ResponseResult(message, data, code, CommonConst.RESPONSE_SUCCESS);
}
public ResponseResult setMessage(String message) {
this.message = message;
return this;
}
public ResponseResult setData(Object data) {
this.data = data;
return this;
}
public ResponseResult setStatus(int status) {
this.status = status;
return this;
}
public ResponseResult setCode(int code) {
this.code = code;
return this;
}
public ResponseResult setTotal(Integer total) {
this.total = total;
return this;
}
}
3、BootstrapConfig
package com.openailab.oascloud.file.common.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
/**
* @Classname: com.openailab.oascloud.security.common.config.BootstrapConsts
* @Description: 引导类
* @Author: zxzhang
* @Date: 2019/10/8
*/
@Data
@Configuration
public class BootstrapConfig {
@Value("${file.client.type}")
private String fileClientType;
@Value("${file.root}")
private String fileRoot;
@Value("${file.biz.file.upload}")
private String uploadDir;
@Value("${file.biz.file.download}")
private String downloadDir;
@Value("${file.biz.file.backup}")
private String backupDir;
@Value("${file.biz.file.tmp}")
private String tmpDir;
@Value("${file.biz.file.breakpoint}")
private String breakpointDir;
@Value("${device.root}")
private String deviceRoot;
@Value("${device.downloadUrl}")
private String deviceDownloadUrl;
@Value("${file.downloadUrl}")
private String fileDownloadUrl;
}
到此 Java语言统计文件夹下所有子文件的详细信息介绍完成。