2012-07-20 94 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