当前位置: 首页 > 知识库问答 >
问题:

JavaApache Commons FileUTIL CopyDirectory异常

昌山
2023-03-14

我正在尝试使用Apache Common的FileUtil来使用CopyDirectory将文件传输到其他磁盘上。然而,我在传输文件时遇到了一个错误。另外,我也不知道为什么,但当我选择一个特定的路径,如C:\Users[用户名]\Documents时,它不仅会给我文档中的内容,还会给我用户文件夹中的其他几个文件夹。。。我不知道这是为什么。在我的文档上运行CopyDirectory时,我也会发生IOException。。。当它试图复制我的音乐时(我不知道它为什么要这么做)。

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

任何帮助都会很好。谢谢

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


}

}

共有1个答案

陶博涉
2023-03-14

线路:

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]

是“隐藏”连接文件夹。当我要求Apache commons io列出documents文件夹的内容时,这些文件夹丢失了。

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

更新我做了更多的测试。似乎Java无法处理JUNTION(或快捷方式)。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方法单独复制每个文件,但这会留下一些文件(也意味着中断原本可用的链接)。

我能想到的允许您(以某种方式)感知此功能的唯一方法是执行一个操作系统进程来完成工作(重新创建连接和/或列出它们)

 类似资料:
  • 应用程序通常会通过抛出另一个异常来响应异常。 实际上,第一个异常引起第二个异常。 它可以是非常有助于用户知道什么时候一个异常导致另一个异常。 “异常链(Chained Exceptions)”帮助程序员做到这一点。 以下是Throwable中支持异常链的方法和构造函数。 Throwable getCause() Throwable initCause(Throwable) Throwable(St

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 问题内容: 异常存储在哪里?堆,堆。如何为异常分配和释放内存?现在,如果您有多个需要处理的异常,是否创建了所有这些异常的对象? 问题答案: 我假设为异常分配的内存分配方式与所有其他对象(在堆上)分配方式相同。 这曾经是个问题,因为您不能为OutOfMemoryError分配内存,这就是直到Java 1.6之前 才没有堆栈跟踪的原因。现在,它们也为stacktrace预分配了空间。 如果您想知道在抛

  • 异常Exception 以传统的try,catch抓取异常 如果在业务层不catch,框架层会捕捉,并返回一个500的server error响应。 如果在开发环境会返回一个500的具体错误的trace响应。 try { throw new \Exception("Error Processing Request", 1); //yield throwExc

  • 因为Java编程语言不需要捕获方法或声明未检查异常(包括 RuntimeException、Error及其子类),程序员可能会试图编写只抛出未检查异常的代码,或使所有异常子类继承自RuntimeException。这两个快捷方式都允许程序员编写代码,而不必担心编译器错误,也不用担心声明或捕获任何异常。虽然这对于程序员似乎很方便,但它避开了捕获或者声明异常的需求,并且可能会导致其他人在使用您的类而产

  • 当面对选择抛出异常的类型时,您可以使用由别人编写的异常 - Java平台提供了许多可以使用的异常类 - 或者您可以编写自己的异常类。 如果您对任何以下问题回答“是”,您应该编写自己的异常类;否则,你可以使用别人的。 你需要一个Java平台中没有表示的异常类型吗? 如果用户能够区分你的异常与由其他供应商编写的类抛出的异常吗? 你的代码是否抛出不止一个相关的异常? 如果您使用他人的例外,用户是否可以访

  • 异常 对于异常处理,倾向使用 raise 而不是 fail。 # 差 fail SomeException, 'message' # 好 raise SomeException, 'message' 不要在带双参数形式的 raise 方法中显式指定 RuntimeError。 # 差 raise RuntimeError, 'message' # 好 - 默认就是 RuntimeError rai

  • 在Java语言中,是使用“异常(exception)”来处理错误及其他异常事件。术语“异常”是短语“异常事件(exceptional event)”的缩写。 异常是在程序执行期间发生的事件,它会中断程序指令的正常流程。 当在方法中发生错误时,该方法创建一个对象并将其移交给运行时系统。 该对象称为“异常对象(exception object)”,包含有关错误的信息,包括错误发生时其类型和程序的状态。