小弟是新手,提问想寻求一个解决方案。
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.   

    只是一个file类 迭代所有的目录,遇到符合条件的根据absolute路径 通过流写写道指定的文件即可 有dir的 先mkdir
      

  2.   

    用递归可以遍历某一目录下的每一个文件
    用到的方法主要有:listFiles()--返回File数组,获得的某一目录下的文件和本级子目录;isFile()--如果是文件就
                                 不再调用它的listFiles,是目录就调用;得到每个文件时,对它进行筛选判断,可以调用自己写的判断方法如boolean isJavaFile(File file);实现可以用正则表达式判断
    return file.getName.matches(".*\\\\.java$");4,5 实现都比较简单
      

  3.   


    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);


    } } }}
    //加个判断就可以了.
      

  4.   

    java.io.FileFilter 或者 java.io.FilenameFilter 进行文件过滤
      

  5.   

    都上的兄弟们都说完了,综合一下,就是用FileFilter去做一个文件夹下的文件读写,然后做一次递归遍历
      

  6.   

    您的意思是不是:边遍历边拷贝,遇到isDirectory就建目录直到遍历完成???
    那我又有个问题了:有些目录下面根本就没有我要的文件,那么是不是拷贝遍历完成之后,还要一个删除遍历来删除那些空的文件夹?
      

  7.   

    这位兄台,我想问您的问题同楼上。
    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());
      

  8.   

    回8L:
    不是的,在遍历过程中,发现条件符合时,要建目录时
    每次判断某个目录isExist(),存在就直接往里面拷文件,不存在就建新的目录;至于遇到isDirectory或者isFile,只是判断是否递归返回,因为如果是目录,那么还得获得
    它的子文件和子目录,即调用listFiles();是文件,那就返回