近来实现的某些功能需要对文件进行批量操作,为方便以后查找阅读,作以下总结。
如需要对文件进行批量重命名、删除文件夹中的所有文件等。
例:删除指定文件夹中的所有文件:(批量删除文件是文件操作经常用到的)
先创建一个文件批量管理工具类,关键代码如下
//删除文件夹及其中内容
public void deleteDictionary(File fileIn) {
if (fileIn.isFile()) {
deleteFiles.add(fileIn); //将删除的文件保存到集合中,
fileIn.delete();//如果是文件就删除
} else {//如果是一个文件夹
File[] files = fileIn.listFiles();
for (File file : files) {
deleteDictionary(file);//如果不是空文件夹则就迭代 deleteDictionary()方法
}
fileIn.delete();//空文件夹就删除
}
}
//删除文件夹下的内容(不删除指定的文件夹)
public void deleteFiles(File FileList) {
if (FileList.listFiles().length == 0) {//如果是空文件夹return
return;
} else {
File[] files = FileList.listFiles();//获取FileList的文件列表
for (File file : files) {//遍历
if (file.isFile()) {
deleteFiles.add(file); //添加到删除到集合,以便显示删除记录
file.delete();//删除指定所有文件
} else {
if (file.listFiles().length == 0) {
file.delete();//删除所有空的文件夹
} else {
deleteDictionary(file);//删除所有非空的文件夹
}}
}
}
}
上面代码的两个方法主要是使用递归来实现对文件的删除,其中需要注意的是使用File类对文件操作时,要注意文件的类型(是否为空的文件夹等),对不同的文件类型需要进行不同的判断以及不同的操作。
Servlet关键代码(doPost方法)
List<File> delFiles = null;
request.setCharacterEncoding("UTF-8");
String filePaths = request.getParameter("filePath");//获取文件路径
FilesUtil util = new FilesUtil();
if(filePaths!=null&&!filePaths.equals("")){
File files = new File(filePaths);
util.deleteFiles(files);//调用方法删除文件夹中的所有子文件
delFiles = util.getDeleteFiles();//获取删除列表
//省略了部分代码
}
上面代码主要是从获取文件路径,然后调用FilesUtil类的deleteFiles方法对指定文件夹进行删除,删除后,调用getDeleteFiles方法获取到删除文件列表,将该集合以及文件路径保存到域中,转发到index.jsp
index.jsp关键代码
将从Servlet传过来的集合进行遍历输出到table下
<center>
<form action="${path}/FileServlet" method="post" >
<input type="hidden" name="driverPath" id="driverPath" />
<h1>删除指定文件夹中的文件</h1>
<tr height="30">
<td colspan="2">文件夹路径:
<input type="text" name="filePath" value="<%if(filePaths!=null&&!filePaths.equals("")){out.println(filePaths);} %>"/>
<input type="submit" value="删除"/>
</td></tr><tr >
<td align="left" colspan="2">
<p>删除记录</p>
<textarea rows="6" cols="50"><%
if(delFiles!=null&&delFiles.size()>0){
for(File file:delFiles){
out.println(file.getAbsolutePath());
}
}
%></textarea>
</td> </tr></table></form></center>
结果:
例:在指定目录下搜索文件(类似文件管理器的文件搜索,在指定文件路径搜索指定类型的文件)
index.jsp关键代码 主要是将传过来的结果files集合遍历输出
<form action="${path}/FileDemoServlet" method="post" id="form1">
<input type="hidden" name="typeString" id="typeString" />
<table border="0" width="500">
<tr><td align="right">文件路径:</td>
<td ><input type="text" name="filePath" id="filePath" />
<input type="submit" name="submit" onclick="serach()" value="搜索"/>
</td></tr><tr>
<td align="right">文件名称:</td>
<td ><input type="text" name="fileName" id="fileName" /></td>
</tr><tr>
<td align="right">后缀:</td>
<td ><select id="typeName">
<option value=".txt">.txt</option>
<option value=".zip">.zip</option>
<option value=".gif">.dll</option>
<option value=".jpg">.jpg</option>
<option value=".bmp">.bmp</option>
<option value=".xls">.xls</option>
<option value=".doc">.doc</option>
<option value=".xml">.xml</option>
<option value=".rar">.rar</option>
</select></td></tr>
<tr height="100">
<td colspan="2" align="center">
<textarea rows="6" cols="45"><%
if(files!=null){
for(File file:files){
out.println(file.getAbsolutePath());
}
}
%></textarea>
</td>
</tr>
</table>
serach函数 获取到后缀下拉框的值并赋给隐藏的input传递到Servlet层
function serach(){
var typeName = document.getElementById("typeName");
document.getElementById("typeString").value= typeName.value
}
FileDemoServlet关键代码 获取传过来的文件路径,文件名关键字、扩展名,不为空则调用搜索文件的方法,将方法返回的集合保存到域中后转发到index.jsp
List<File> files = null;
request.setCharacterEncoding("UTF-8");
String filePath = request.getParameter("filePath"); //获取文件路径
String fileName = request.getParameter("fileName"); //获取文件名关键字
String extendName = request.getParameter("typeString"); //文件扩展名
if(filePath!=null&&!filePath.equals("")&&
fileName!=null&&!fileName.equals("")&&
extendName!=null&&!extendName.equals("")){
files= FileUtil.findFiles(filePath,fileName,extendName);//调用的方法
//省略了部分代码
}
定义一个返回值为List<File>的方法,用于实现文件搜索功能,该方法三个参数分别是指定搜索目录路径,搜索文件名称,文件的扩展名,获取到文件数组后遍历文件数组,再调用findFileName方法(文件匹配方法),符合匹配就添加到集合中
public static List<File> findFiles(String baseName, String tarFileName,String exStr) {
List<File> fileList = new ArrayList<File>();//定义保存返回值的List对象
File baseDir = new File(baseName); //创建File对象,参数为baseName
if (!baseDir.exists() || !baseDir.isDirectory()) {//不是目录或不存在
return fileList; //返回
}
String tempName = null;
File[] files = baseDir.listFiles(new ExtendFileNameFilter(exStr)); //获取参数目录下的文件数组
for (File file:files) { //循环遍历文件数组
if (!file.isDirectory()) { //如果数组中的文件不是一个目录
tempName = file.getName(); //获取该数组的名称
if (findFileName(tarFileName, tempName)) { //调用文件匹配方法
fileList.add(file.getAbsoluteFile()); //将指定的文件名添加到集合中
}}}
return fileList;
}
findFileName方法 这个方法用于查找匹配的文件,如果查找的文件名称和搜索的方式匹配,就返回true,否则false
public static boolean findFileName(String FileName, String name) {
int length = FileName.length(); // 获取参数的长度
int startLength = name.length();
int strIndex = 0;
char eleChar;
for (int i = 0; i < length; i++) { // 遍历字符参数字符串的字符
eleChar = FileName.charAt(i); // 获取字符串中每个索引位置的字符
if (eleChar == '*') { // 如果是星号表示任意多个字符
while (strIndex < startLength) {
if (findFileName(FileName.substring(i + 1), name
.substring(strIndex))) { // 如果文件名与搜索模型匹配
return true;
}
strIndex++; }
} else if (eleChar == '?') { // 如果包含问号 表示一个任意字符
strIndex++;
if (strIndex > startLength) { // 如果str中没有字符可以匹配“?”号
return false;
}
} else {
if ((strIndex >= startLength) || (eleChar != name.charAt(strIndex))) { // 如果没有查找到匹配的文件
return false;
}
strIndex++;
} }
return (strIndex == startLength);
}
ExtendFileNameFilter过滤器代码(用于判断是否文件的扩展名是否跟指定扩展名相同,相同返回true,反之false)
public class ExtendFileNameFilter implements FileFilter {
private String extendName;//过滤文件扩展名
public ExtendFileNameFilter(String extend){
this.extendName = extend;
}
@Override
public boolean accept(File pathname) {
if (pathname.getName().toLowerCase().endsWith(extendName.toLowerCase())
||pathname.isDirectory())//文件的扩展名是否跟指定扩展名一样
{
return true;
}
else {
}
return false;
}
}
效果