Java Apache Commons FileUTIL CopyDirectory异常

Java Apache Commons FileUTIL CopyDirectory异常,java,io,apache-commons,fileutils,Java,Io,Apache Commons,Fileutils,我正在尝试使用apachecommon的FileUtil来使用CopyDirectory将文件传输到其他磁盘上。然而,当涉及到转移我的文件时,我遇到了一个错误。另外,我也不知道为什么,但是当我选择一个特定的路径,比如C:\Users[UserName]\Documents,它不仅会给我文档中的内容,还会给我用户文件夹中的一些其他文件夹。。。我不知道这是为什么。我在我的文档上运行CopyDirectory时也会发生异常。。。当它试图复制我的音乐时(我不知道它为什么这么做) 在我的代码中,它以正统的

我正在尝试使用apachecommon的FileUtil来使用CopyDirectory将文件传输到其他磁盘上。然而,当涉及到转移我的文件时,我遇到了一个错误。另外,我也不知道为什么,但是当我选择一个特定的路径,比如C:\Users[UserName]\Documents,它不仅会给我文档中的内容,还会给我用户文件夹中的一些其他文件夹。。。我不知道这是为什么。我在我的文档上运行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);


}
}行:

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]
每次都会打印“无法列出…”

至于解决方案……您可以要求提供一个文件列表(正如我们所看到的,这至少有效),然后使用
FileUtils.copyFile
方法分别复制每个文件,但这会留下一些文件(也意味着断开本来可用的链接)


我认为让您(以某种方式)保留此功能的唯一方法是执行一个操作系统进程来完成工作(重新创建连接并/或列出它们)

有什么例外吗?主要问题(我可以想不到)是,您试图复制的许多目录实际上都是“链接”(更准确地说,通常会有连接),Java/IO Commons可能无法处理这些代码。我不再在计算机上使用代码了,但我相信这是MyMusic的IO Exception.IO(不记得关于错误的具体信息)。我尝试删除MyMusic文件夹以查看会发生什么,然后我得到了IOException(拒绝访问我的音乐)的内容。是否仍然可以获取指向未“链接”的文档的链接或者有交叉点。我只是严格要求我的文档文件夹中的内容…你好,程序员,谢谢你详细地向我解释了这一点。我在\\Documents两个文档中都有它,但正如你所说的那样,由于交叉点,它也抛出了IO异常。我一定会查看文件列表并复制它们当你说“这会留下一些文件,也意味着断开其他可用的链接”时,你是什么意思?你是说这会断开指向MyMusic的链接吗?如果是这样的话,那就太好了。再次感谢!@AlanShih,是的,你会失去任何连接(在我的示例中是我的musc、视频和图片)
    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);

        }

    }