我想要这个方法能复制文件或者目录,可是当复制目录的时候,如果这个目录里面有对个子项,只能复制里面的一个子项  大神给看看啊
**
     * 复制文件或者目录
     * @param srcFile:原始文件或目录
     * @param desFile:目标文件或目录
     * 
     */
      
    public static void copyFile(File srcFile, File desFile)throws Exception {
        RandomAccessFile srcSaf = null;
        RandomAccessFile desSaf = null;
          
        try {
            // 如果要复制的是文件夹,要先创建文件夹
            if(srcFile.isDirectory()){
                desFile.mkdir();
                for(File sub : srcFile.listFiles()){
                        File newFile = new File(desFile, sub.getName());
                          
                        copyFile(sub, newFile);
                }
            }
            // 文件的复制
            srcSaf = new RandomAccessFile(srcFile, "r");
            desSaf = new RandomAccessFile(desFile, "rw");
              
            byte[] buf = new byte[1024*10];
            int len = 0;
            while((len = srcSaf.read(buf)) != -1){
                desSaf.write(buf, 0, len);
            }
              
        } catch (FileNotFoundException e) {
            throw e;
        } finally{
            srcSaf.close();
            desSaf.close();
        }
    }

解决方案 »

  1.   

    你调试时没有报异常吗?
    如果是文件夹,finally中的代码也会执行,会有空指针异常 public static void copyFile(File srcFile, File desFile) throws Exception {
    RandomAccessFile srcSaf=null;
    RandomAccessFile desSaf=null;
    // 如果要复制的是文件夹,要先创建文件夹
    if (srcFile.isDirectory()) {
    desFile.mkdir();
    for (File sub : srcFile.listFiles()) {
    File newFile=new File(desFile,sub.getName());
    copyFile(sub,newFile);
    }
    return; //直接返回
    }
    try {  //把try改到这里
    // 文件的复制
    srcSaf=new RandomAccessFile(srcFile,"r");
    desSaf=new RandomAccessFile(desFile,"rw");
    byte[] buf=new byte[1024*10];
    int len=0;
    while ((len=srcSaf.read(buf))!=-1) {
    desSaf.write(buf,0,len);
    }
    } catch (FileNotFoundException e) {
    throw e;
    } finally {
    srcSaf.close();
    desSaf.close();
    }
    }代码很不合理,尽量别随便抛异常,最好全部捕获
      

  2.   


    public static void copyFile(File srcFile, File desFile)throws Exception 
       {
       
           RandomAccessFile srcSaf = null;
           RandomAccessFile desSaf = null;
            
           
           
           try {
               // 如果要复制的是文件夹,要先创建文件夹
               if(srcFile.isDirectory()){
                   desFile.mkdirs(); //递归创建
                   for(File sub : srcFile.listFiles()){
                           File newFile = new File(desFile, sub.getName());
                             
                           copyFile(sub, newFile);
                   }
               }
               // 文件的复制
               srcSaf = new RandomAccessFile(srcFile, "r");
               desSaf = new RandomAccessFile(desFile, "rw");
                 
               byte[] buf = new byte[1024*10];
               int len = 0;
               while((len = srcSaf.read(buf)) != -1){
                   desSaf.write(buf, 0, len);
               }
                 
           } catch (FileNotFoundException e) {
               throw e;
           } finally{
               if( srcSaf != null )srcSaf.close(); //关闭流先判断
               if( desSaf != null )desSaf.close();
           }
       }
      

  3.   

    为什么要return  啊???
      

  4.   

    代码里没有else处理也就是直接复制文件的东西.
      

  5.   

    如果要复制的是文件夹,后面对文件的操作就没用了,或者用else也行
      

  6.   


    public static void copyFile(File srcFile, File desFile) {
    RandomAccessFile srcSaf=null;
    RandomAccessFile desSaf=null;
    // 如果要复制的是文件夹,要先创建文件夹
    if (srcFile.isDirectory()) {
    desFile.mkdir();
    for (File sub : srcFile.listFiles()) {
    File newFile=new File(desFile,sub.getName());
    copyFile(sub,newFile);
    }
    } else {
    // 文件的复制
    try {
    srcSaf=new RandomAccessFile(srcFile,"r");
    desSaf=new RandomAccessFile(desFile,"rw");
    byte[] buf=new byte[1024*10];
    int len=0;
    while ((len=srcSaf.read(buf))!=-1) {
    desSaf.write(buf,0,len);
    }
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    srcSaf.close();
    desSaf.close();
    } catch (Exception e2) {
    e2.printStackTrace();
    }
    }
    }
    }