我正在尝试使用Apache Common的FileUtil来使用CopyDirectory将文件传输到其他磁盘上。但是,在转移我的文档方面,我遇到了错误。此外,我不知道为什么,但当我选择一个特定的路径,如C:\ Users [UserName] \ Documents时,它不会给我JUST文档中的内容,它给了我一些用户文件夹中的其他文件夹..我不知道为什么会这样。我在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);
}
}
答案 0 :(得分: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
方法单独复制每个文件,但这会留下一些后面的文件(也意味着打破原本可用的链接)。
我认为允许你(以某种方式)坚持这种功能的唯一方法是执行一个操作系统进程来完成工作(重新创建连接点和/或列出它们)