0

Apache Common の FileUtil を使用して、CopyDirectory を使用してファイルを他のディスクに転送しようとしています。ただし、マイ ドキュメントの転送に関してはエラーが発生します。また、理由はわかりませんが、C:\Users[UserName]\Documents のような特定のパスを選択すると、Documents のコンテンツだけが表示されず、User's Folder に他のいくつかのフォルダーが表示されます。 . なぜだかわかりません。また、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 が「My Music」ディレクトリの内容を一覧表示しようとすると、null 値が返されるため、例外がスローされます。

私はそれを試すためにこの簡単なテストを行いました:

    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することがわかっているように)、代わりにメソッドを使用して各ファイルを個別にコピーできますが、それではいくつかのファイルが残されます(また、他の方法で利用できるリンク)。

この機能を(何らかの方法で)維持できるようにする唯一の方法は、OSプロセスを実行して作業を行うことです(ジャンクションを再作成するか、それらをリストします)

于 2012-07-21T01:39:37.240 に答える