小弟是新手,提问想寻求一个解决方案。
1、给定一个目录,可以是本机的也可能是网络上的某个主机的,有所有权限。
2、目录下有很多文件,也有很多文件夹。也就是说该目录下不只一层。
3、我要从给定的目录下及其子目录下筛选出指定文件,比如:后缀名为.java;或者文件名中包含当前日期20091013的文件。
4、找到后把这些文件按照原目录中的相对位置摆放到新目录下。注意,并不是一股脑的堆在同一个目录下。这个过程中,如果原目录中的子目录下有我们要拷贝的文件,则要在新目录下先新建与原子目录同名的子目录,然后把文件拷贝到子目录下。
5、删除原目录下的文件。例如:
给定目录是d:\。
目录下有d:\a.xml,d:\b.xml,d:\a.java文件,子目录有d:\java,d:\xml,子目录下有d:\xml\a.xml,d:\xml\b.xml,d:\java\a.java。
给定目的路径是f:\。
筛选规则为:.xml文件
那么经过程序处理之后,应为:
1、d:\下面只有d:\a.java和d:\java,d:\xml子目录。d:\java\a.java文件还在。d:\xml子目录空了。
2、在f:\下有了f:\a.xml,f:\b.xml文件和f:\xml子目录,子目录下有f:\xml\a.xml,f:\xml\b.xml两个文件。
如果给定的筛选规则为:.java文件,以此类推。还望大家多多帮忙,只是说说思路也行,说思路时麻烦吧每一步的实用的API说出来。谢谢!
1、给定一个目录,可以是本机的也可能是网络上的某个主机的,有所有权限。
2、目录下有很多文件,也有很多文件夹。也就是说该目录下不只一层。
3、我要从给定的目录下及其子目录下筛选出指定文件,比如:后缀名为.java;或者文件名中包含当前日期20091013的文件。
4、找到后把这些文件按照原目录中的相对位置摆放到新目录下。注意,并不是一股脑的堆在同一个目录下。这个过程中,如果原目录中的子目录下有我们要拷贝的文件,则要在新目录下先新建与原子目录同名的子目录,然后把文件拷贝到子目录下。
5、删除原目录下的文件。例如:
给定目录是d:\。
目录下有d:\a.xml,d:\b.xml,d:\a.java文件,子目录有d:\java,d:\xml,子目录下有d:\xml\a.xml,d:\xml\b.xml,d:\java\a.java。
给定目的路径是f:\。
筛选规则为:.xml文件
那么经过程序处理之后,应为:
1、d:\下面只有d:\a.java和d:\java,d:\xml子目录。d:\java\a.java文件还在。d:\xml子目录空了。
2、在f:\下有了f:\a.xml,f:\b.xml文件和f:\xml子目录,子目录下有f:\xml\a.xml,f:\xml\b.xml两个文件。
如果给定的筛选规则为:.java文件,以此类推。还望大家多多帮忙,只是说说思路也行,说思路时麻烦吧每一步的实用的API说出来。谢谢!
用到的方法主要有:listFiles()--返回File数组,获得的某一目录下的文件和本级子目录;isFile()--如果是文件就
不再调用它的listFiles,是目录就调用;得到每个文件时,对它进行筛选判断,可以调用自己写的判断方法如boolean isJavaFile(File file);实现可以用正则表达式判断
return file.getName.matches(".*\\\\.java$");4,5 实现都比较简单
import java.io.*;public class Copy {
public void copyDir(String oldUrl,String newUrl) {
(new File(newUrl)).mkdirs();
File[] file = (new File(oldUrl)).listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isFile()) {
file[i].toString();
FileInputStream input;
try {
input = new FileInputStream(file[i]);
FileOutputStream output = new FileOutputStream(newUrl + "/"
+ (file[i].getName()).toString());
byte[] buffer = new byte[1024 * 6];
int len;
while ((len = input.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
output.flush();
output.close();
input.close(); } catch (Exception e) {
e.printStackTrace();
}
}
else if(file[i].isDirectory()){
String url3 = null;
url3=newUrl+"\\"+file[i].toString().substring(newUrl.length()+1,file[i].toString().length());
new Copy().copyDir(file[i].toString(),url3);
} } }}
//加个判断就可以了.
那我又有个问题了:有些目录下面根本就没有我要的文件,那么是不是拷贝遍历完成之后,还要一个删除遍历来删除那些空的文件夹?
PS:我还发现您代码里的一个小小的BUG,
url3=newUrl+"\\"
+file[i].toString().substring(newUrl.length()+1,
file[i].toString().length());
应为:url3=newUrl+"\\"
+file[i].toString().substring(oldUrl.length()+1,
file[i].toString().length());
不是的,在遍历过程中,发现条件符合时,要建目录时
每次判断某个目录isExist(),存在就直接往里面拷文件,不存在就建新的目录;至于遇到isDirectory或者isFile,只是判断是否递归返回,因为如果是目录,那么还得获得
它的子文件和子目录,即调用listFiles();是文件,那就返回