2012-07-20 48 views
0

我正在嘗試使用Apache Common的FileUtil來使用CopyDirectory將文件傳輸到其他磁盤上。但是,在傳輸我的文檔時我遇到了一個錯誤。此外,我不知道爲什麼,但是當我選擇像C:\ Users [UserName] \ Documents這樣的特定路徑時,它不會給我JUST文檔中的內容,它給了我用戶文件夾中的其他文件夾..我不知道這是爲什麼。當我在MyDocuments上運行CopyDirectory時,我也IOException ...當它試圖複製MyMusic(我不知道它爲什麼這樣做的第一個地方Java Apache Commons FileUTIL CopyDirectory異常

在我的代碼中,它正確地複製收藏夾和桌面... 。雖然看似在收藏夾中的「收藏夾工具欄」已經改變了文件夾「鏈接」文件夾

任何幫助將是巨大的感謝

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import org.apache.commons.io.*; 

public class TransferJet { 
public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
public static void main(String[] args) throws IOException { 

     System.out.print("Please enter the username:"); 
     String user = in.readLine(); 

     System.out.print("Please enter the drive letter of the old primary partition:"); 
     String oldPrimaryLetter = in.readLine(); 
     System.out.print("Please enter the drive letter of the old secondary partition:"); 
     String oldSecondaryLetter = in.readLine(); 

     System.out.print("Please enter the drive letter of the new primary partition:"); 
     String newPrimaryLetter = in.readLine(); 
     System.out.print("Please enter the driver letter of the new secondary partition:"); 
     String newSecondaryLetter = in.readLine(); 


     if(user.equals("") || oldSecondaryLetter.equals("") || oldPrimaryLetter.equals("") || newPrimaryLetter.equals("") || newSecondaryLetter.equals("")) 
     { 
      System.out.println("Invalid directory or file name."); 
      System.exit(0); 
     } 

     String newFiles = ""; 
     String oldFiles = ""; 
     File source = null; 
     File destination = null; 

     System.out.println("Moving Favorites..."); 
     oldFiles = oldPrimaryLetter + ":\\Users\\" + user + "\\Favorites"; 
     //String oldFilesA = "C:\\Users\\ashih\\Favorites"; 
     //String newFilesA = "G:\\Users\\ashih\\Favorites"; 
     newFiles = newPrimaryLetter + ":\\Users\\" + user + "\\Favorites"; 
     source = new File(oldFiles); 
     destination = new File(newFiles); 
     FileUtils.copyDirectory(source, destination); 


     System.out.println("Moving Desktop..."); 
     oldFiles = oldPrimaryLetter + ":\\Users\\" + user + "\\Desktop"; 
     newFiles = newPrimaryLetter + ":\\Users\\" + user + "\\Desktop"; 
     source = new File(oldFiles); 
     destination = new File(newFiles); 
     FileUtils.copyDirectory(source, destination); 

     System.out.println("Moving My Documents..."); 
     oldFiles = oldPrimaryLetter + ":\\Users\\" + user + "\\"; 
     newFiles = newPrimaryLetter + ":\\Users\\" + user + "\\Documents"; 
     source = new File(oldFiles); 
     destination = new File(newFiles); 
     FileUtils.copyDirectory(source, destination); 

     System.out.println("Moving Old Secondary to New Secondary..."); 
     oldFiles = oldSecondaryLetter + ":\\"; 
     newFiles = newSecondaryLetter + ":\\"; 
     source = new File(oldFiles); 
     destination = new File(newFiles); 
     FileUtils.copyDirectory(source, destination); 


} 

}

+0

有什麼異常?主要的問題(我能想到的是我的頭頂)是,你試圖複製的許多目錄實際上是「鏈接」(更準確地說,通常是連接點),Java/IO Commons可能不是能夠處理 – MadProgrammer 2012-07-20 23:17:25

+0

我不再在計算機上使用代碼,但我相信它是MyMusic的IO Exception.IO(不記得具體的錯誤)。我嘗試刪除MyMusic文件夾以查看會發生什麼,然後我收到了IOException(拒絕訪問我的音樂)行。反正有鏈接到我的文檔不是「鏈接」或有路口。我只是想要在我的文檔文件夾中的內容... – Alan 2012-07-20 23:44:35

回答

1

行:!

oldFiles = oldPrimaryLetter + ":\\Users\\" + user + "\\"; 
newFiles = newPrimaryLetter + ":\\Users\\" + user + "\\Documents"; 

看起來不正確的,它應該是

oldFiles = oldPrimaryLetter + ":\\Users\\" + user + "\\Documents"; 
newFiles = newPrimaryLetter + ":\\Users\\" + user + "\\Documents"; 

這將至少解釋爲什麼你複製的音樂:P

我做了一個快速測試和可以複製的問題。當我看看目錄列表時,我發現

20/12/2010 06:56 PM <JUNCTION>  My Music [C:\Users\swhitehead\Music] 
20/12/2010 06:56 PM <JUNCTION>  My Pictures [C:\Users\swhitehead\Pictures] 
20/12/2010 06:56 PM <JUNCTION>  My Videos [C:\Users\swhitehead\Videos] 

是「隱藏」的JUNCTION文件夾。當我要求Apache commons-io列出文檔文件夾的內容時,這些文件夾丟失。

我需要運行對源進行檢查,以瞭解更多

UPDATE 我做了一些更多的測試。看起來Java不能處理JUNCTIONS(或者就此而言是捷徑)。 Commons-IO正在拋出異常,因爲當它試圖列出「我的音樂」目錄中的內容時,它將返回一個空值。

我這樣做快速測試嘗試一下:

File myMusic = new File(oldFiles + File.separator + "My Music"); 
    System.out.println(myMusic); 
    System.out.println(myMusic.isDirectory()); 
    System.out.println(myMusic.isAbsolute()); 
    System.out.println(myMusic.isHidden()); 
    System.out.println(myMusic.getCanonicalFile()); 
    System.out.println(myMusic.getAbsoluteFile()); 

    File[] lstFiles = myMusic.listFiles(); 
    if (lstFiles == null) { 

     System.out.println("Can not list..."); 

    } else { 

     for (File file : lstFiles) { 

      System.out.println(file); 

     } 

    } 

這將打印「無法列出......」每一次。

至於一個解決方案...你可以要求一個文件列表(正如我們已經看到這至少有效),然後單獨使用FileUtils.copyFile方法單獨複製每個文件,但這會留下一些文件也意味着打破原本可用的鏈接)。

我能想到的,讓你的唯一方法(在某種程度上)perseve這functioanlity是執行操作系統過程中做的工作(重建結和/或列出)

+0

你好MadProgrammer, 感謝您通過所有的細節向我解釋這一點。我確實在\\有兩個文件,但是它因爲連接點而導致IOException異常。我一定會查看文件列表並手動複製它們。當你說「這會留下一些文件並且意味着打破原本可用的鏈接」時,你的意思是什麼「你的意思是它會打斷與MyMusic的鏈接?如果是這樣的話,那會很好。再次感謝! – Alan 2012-07-21 13:35:17

+0

@AlanShih,是的,你會失去任何路口(我的肌肉,視頻和圖片在我的例子中) – MadProgrammer 2012-07-21 20:11:24

+0

得到它的工作。感謝MadProgrammer – Alan 2012-07-24 18:53:10

相關問題