0

我正在尝试使用 Apache Common 的 FileUtil 来使用 CopyDirectory 将文件传输到其他磁盘上。但是,在传输“我的文档”时出现错误。另外,我不知道为什么,但是当我选择像 C:\Users[UserName]\Documents 这样的特定路径时,它不会只给我 Documents 中的内容,而是给我用户文件夹中的其他一些文件夹。 .我不知道这是为什么。当我在 MyDocuments 上运行 CopyDirectory 时,我也会出现 IOException ......当它试图复制 MyMusic 时(我不知道它为什么首先这样做。

在我的代码中,它体面地复制了收藏夹和桌面......尽管它似乎已将收藏夹“收藏夹工具栏”中的文件夹更改为“链接”文件夹。

任何帮助都会很棒。谢谢!

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);


}

}

4

1 回答 1

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 列出文档文件夹的内容时,这些文件夹在哪里丢失。

我需要对源进行检查以了解更多信息

更新 我做了更多的测试。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方法单独复制每个文件,但这会留下一些文件(也意味着破坏否则将可用的链接)。

我能想到的让你(以某种方式)保持这种功能的唯一方法是执行一个操作系统进程来完成工作(重新创建连接和/或列出它们)

于 2012-07-21T01:39:37.240 回答