2010-12-17 23 views
0

下面的代碼似乎卡在無限循環中。我必須終止程序來停止它的運行。文件副本卡在無限循環中

下面是輸出&代碼 -

File copied from c:\projects\test\buildlist.txt to c:\projects\test\newtest\buildlist.txt 
File copied from c:\projects\test\GHTELE5S605A.jad to c:\projects\test\newtest\GHTELE5S605A.jad 
File copied from c:\projects\test\GHTELE5S605A.jar to c:\projects\test\newtest\GHTELE5S605A.jar 
File copied from c:\projects\test\GHTele5T240w400h.jad to c:\projects\test\newtest\GHTele5T240w400h.jad 
File copied from c:\projects\test\GHTele5T240w400h.jar to c:\projects\test\newtest\GHTele5T240w400h.jar 
File copied from c:\projects\test\newtest\buildlist.txt to c:\projects\test\newtest\newtest\buildlist.txt 
File copied from c:\projects\test\newtest\GHTELE5S605A.jad to c:\projects\test\newtest\newtest\GHTELE5S605A.jad 
File copied from c:\projects\test\newtest\GHTELE5S605A.jar to c:\projects\test\newtest\newtest\GHTELE5S605A.jar 
File copied from c:\projects\test\newtest\GHTele5T240w400h.jad to c:\projects\test\newtest\newtest\GHTele5T240w400h.jad 
File copied from c:\projects\test\newtest\GHTele5T240w400h.jar to c:\projects\test\newtest\newtest\GHTele5T240w400h.jar 
File copied from c:\projects\test\newtest\newtest\buildlist.txt to c:\projects\test\newtest\newtest\newtest\buildlist.txt 
File copied from c:\projects\test\newtest\newtest\GHTELE5S605A.jad to c:\projects\test\newtest\newtest\newtest\GHTELE5S605A.jad 
File copied from c:\projects\test\newtest\newtest\GHTELE5S605A.jar to c:\projects\test\newtest\newtest\newtest\GHTELE5S605A.jar 
File copied from c:\projects\test\newtest\newtest\GHTele5T240w400h.jad to c:\projects\test\newtest\newtest\newtest\GHTele5T240w400h.jad 
File copied from c:\projects\test\newtest\newtest\GHTele5T240w400h.jar to c:\projects\test\newtest\newtest\newtest\GHTele5T240w400h.jar 
File copied from c:\projects\test\newtest\newtest\newtest\buildlist.txt to c:\projects\test\newtest\newtest\newtest\newtest\buildlist.txt 
File copied from c:\projects\test\newtest\newtest\newtest\GHTELE5S605A.jad to c:\projects\test\newtest\newtest\newtest\newtest\GHTELE5S605A.jad 
File copied from c:\projects\test\newtest\newtest\newtest\GHTELE5S605A.jar to c:\projects\test\newtest\newtest\newtest\newtest\GHTELE5S605A.jar 
File copied from c:\projects\test\newtest\newtest\newtest\GHTele5T240w400h.jad to c:\projects\test\newtest\newtest\newtest\newtest\GHTele5T240w400h.jad 
File copied from c:\projects\test\newtest\newtest\newtest\GHTele5T240w400h.jar to c:\projects\test\newtest\newtest\newtest\newtest\GHTele5T240w400h.jar 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\buildlist.txt to c:\projects\test\newtest\newtest\newtest\newtest\newtest\buildlist.txt 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\GHTELE5S605A.jad to c:\projects\test\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jad 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\GHTELE5S605A.jar to c:\projects\test\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jar 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\GHTele5T240w400h.jad to c:\projects\test\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jad 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\GHTele5T240w400h.jar to c:\projects\test\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jar 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\buildlist.txt to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\buildlist.txt 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jad to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jad 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jar to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jar 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jad to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jad 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jar to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jar 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\buildlist.txt to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\newtest\buildlist.txt 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jad to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jad 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jar to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\newtest\GHTELE5S605A.jar 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jad to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jad 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jar to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\newtest\GHTele5T240w400h.jar 
File copied from c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\newtest\buildlist.txt to c:\projects\test\newtest\newtest\newtest\newtest\newtest\newtest\newtest\newtest\buildlist.txt 

-

public static void main(String args[]) throws IOException{ 

    args = new String[2]; 
    args[0] = "c:\\projects\\test"; 
    args[1] = "c:\\projects\\test\\newtest"; 

     File srcFolder = new File(args[0]); 
     File destFolder = new File(args[1]); 

     //make sure source exists 
     if(!srcFolder.exists()){ 

      System.out.println("Directory does not exist."); 
      //just exit 
      System.exit(0); 

     }else{ 

      try{ 
      copyFolder(srcFolder,destFolder); 
      }catch(IOException e){ 
      e.printStackTrace(); 
      //error, just exit 
       System.exit(0); 
      } 
     } 

     System.out.println("Done"); 
    } 

    public static void copyFolder(File src, File dest) 
     throws IOException{ 

     if(src.isDirectory()){ 

      //if directory not exists, create it 
      if(!dest.exists()){ 
       dest.mkdir(); 
       System.out.println("Directory copied from " 
           + src + " to " + dest); 
      } 

      //list all the directory contents 
      String files[] = src.list(); 

      for (String file : files) { 
       //construct the src and dest file structure 
       File srcFile = new File(src, file); 
       File destFile = new File(dest, file); 
       //recursive copy 
       copyFolder(srcFile,destFile); 
      } 

     }else{ 
      //if file, then copy it 
      //Use bytes stream to support all file types 
      InputStream in = new FileInputStream(src); 
       OutputStream out = new FileOutputStream(dest); 

       byte[] buffer = new byte[1024]; 

       int length; 
       //copy the file content in bytes 
       while ((length = in.read(buffer)) > 0){ 
        out.write(buffer, 0, length); 
       } 

       in.close(); 
       out.close(); 
       System.out.println("File copied from " + src + " to " + dest); 
     } 
    } 
} 

感謝您的幫助。

+1

您應該學習如何使用調試器,這樣您就可以在任何人回答您的發佈之前就發現錯誤。 – perdian 2010-12-17 13:16:01

回答

4

在循環列出的文件時過濾掉目標目錄。

if (src.equals(destFolder)) { 
    continue; 
} 

我建議你使用File[] files = src.listFiles();而不是src.list()

並且注意將數組括號放在類型而不是變量上是更好的樣式,即File[] files而不是File files[]

另請注意:讀取文件時發現錯誤。 InputStream.read(byte[])即使未到達文件結尾也可能返回0,請檢查!= -1而不是> 0

1
try{ 
    copyFolder(srcFolder,destFolder);  // <-- this is where your problem lies 
}catch(IOException e){ 

你的程序進入無限遞歸,因爲在這個方法中,你再次爲新創建的目錄調用它。

您應該重寫它,以便它只遞歸遍歷源目錄。

0

問題出在您將文件複製到源目錄的子目錄的事實。

當列出的文件和目錄進行復制,你應該排除的目標目錄,否則就必然會陷入一個死循環:

String files[] = src.list(); 
for (String file : files) { 
    // Test if the file is equal to the destination directory; 
    // - if so, just skip it ! (continue) 
    // - if not so, you can process the file 
} 
+0

感謝您的幫助 – 2010-12-17 14:39:30

1

如果你不需要寫複製功能你自己,你應該用圖書館來做到這一點。像Apache commons IO一樣。

否則檢查您是否未將目標(作爲源)複製到目標。