对文件夹下的文件及文件夹进行排序
我们在开发测试平台的时候,遇到一个这样的问题:通过给远程主机发送一个命令,执行自动化测试用例后,需要获取自动化测试用例report文件夹上新产生的测试报告。测试报告是以时间戳命名的文件夹,但同时会更新几个其他的文件,如下图所示:
我们需要做的是取出最新产生的文件夹,拉取到本地保存起来。可是如何获取最新产生的文件夹呢?网上查了一下,有如下的方法:
(1) 给出文件路径,对文件夹下的所有文件及文件夹进行排序.
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
public class FileSort {
public static void main(String[] args) {
File file = new File("E:\\workspace\\Never.userManager\\test-output"); //目录路径
if(file.isDirectory()){ //判断file是否为目录
String[] fileNames = file.list();
Arrays.sort(fileNames,new StringComparator());
for(int i=0;i<</SPAN>fileNames.length;i++){
System.out.println(fileNames[i]);
}
}
}
}
//此类实现Comparable接口
class StringComparator implements Comparator{
@Override
public int compare(String s1, String s2) {
if(StringComparator.returnDouble(s1)>StringComparator.returnDouble(s2))
return -1;
else if(StringComparator.returnDouble(s1)returnDouble(s2))
return 1;
else
return 0;
}
public static double returnDouble(String str){
StringBuffer sb = new StringBuffer();
for(int i=0;i<</SPAN>str.length();i++){
if(Character.isDigit(str.charAt(i)))
sb.append(str.charAt(i));
else if(str.charAt(i)=='.'&&i<</SPAN>str.length()-1&&Character.isDigit(str.charAt(i+1)))
sb.append(str.charAt(i));
else break;
}
if(sb.toString().isEmpty())
return 0;
else
return Double.parseDouble(sb.toString());
}
}
运行程序可以得到如下结果:
通过这个程序,我们可以将指定的文件夹下的所有文件夹和文件进行按时间进行了排序,并且文件夹在前文件在后显示出来的。
可是又遇到一个问题:我们需要在远程机器上获取最新产生的报告,没有办法直接传送远程机器的路径,所以这个方法不适用,需要考虑其他的方法。
(2)执行Linux命令ls –t
Linux命令ls –t可以以时间倒序来列出文件夹下的所有文件,于是我们就可以通过向远程主机发送ls –t命令,然后获取输出就能得到想要的文件。如:
String cmd = "cd " + reportpath + ";" + "ls -t";
String result = null;
try {
result = execAndResult(cmd,5);//远程执行命令,超时时间为5秒
} catch (Exception e) {
e.printStackTrace();
}
// 获取最新的报告
log.info("文件名:" + result);
String[] files = result.split("\n");
现在字符串files中存放的就是按时间为逆序排列的文件及文件夹,但是ls –t有一个问题,就是它不会把文件夹排列到最前面,而是文件夹和文件混合排列的。这样就造成了,最后产生的文件可能排列在我们需要的测试报告文件夹前面,问题仍然没有解决。
(3)排除非数字文件或文件夹
根据我们的需要,我们要获取的是最新产生的一个以时间戳命名的文件夹,但是上面的方法二我们不知道这个文件夹在哪儿一个位置。也不就能通过下标来进行读取,所以需要进一步处理,将不是以时间戳命名的文件或是文件夹过滤掉。示例代码如下:
String cmd = "cd " + reportpath + ";" + "ls -t";
String result = null;
try {
result = execAndResult(cmd,5);
} catch (Exception e) {
e.printStackTrace();
}
// 获取最新的报告
log.info("文件名:" + result);
String[] files = result.split("\n");
// 判断新的报告是否产生
Pattern pattern = Pattern.compile("[0-9]*");
String filename = null;
for (String tmp : files) {
Matcher isNum = pattern.matcher(tmp);
if (isNum.matches()) {
log.info("测试报告生成成功,测试报告文件夹是:" + tmp);
filename = tmp;
break;
}
}
先进入特定的文件路径下,执行ls –t命令,获取出所有的文件及文件夹。然后通过正则表达式过滤结果,第一个以时间戳命名的文件夹即是我们需要的内容。当然,这个report文件夹下没有以时间戳命名的文件,否则还需要判断一下是否是文件夹?