web-dev-qa-db-ja.com

Java:ファイルとディレクトリを含むディレクトリを新しいパスに移動します

いくつかのファイルを含む1つのディレクトリと、さらに多くのファイルを含むサブディレクトリがあります。

Folder -  Directory (path -> /home/abc/xyz/Folder)
  ->Abc.txt  (file)
  -> Xyz.Zip (file)
  -> Address (Sub Directory)
         -> PWZ.log (file)
         -> CyZ.xml (file)
  -> DataLog.7Zip

私がやろうとしているのは、この完全なディレクトリを、すべてのファイルとサブフォルダ(およびそれらのファイル)を含むあるパスから別のパスに移動することです。

つまり、この「フォルダ」を/ home/abc/xyz/Folderから/ home/abc/subdir/Folderに移動します。

Javaは、FOLDERディレクトリに基づいてこのタスクを実行するためのAPIを提供しますか、またはこのパスにのみすべてのファイルを再帰的にコピーする必要がありますか?

12
learner

最善のアプローチは、おそらく次のような再帰的な方法です。これは、ファイルを一時フォルダーに移動するために作成した方法です。

private boolean move(File sourceFile, File destFile)
{
    if (sourceFile.isDirectory())
    {
        for (File file : sourceFile.listFiles())
        {
            move(file, new File(file.getPath().substring("temp".length()+1)));
        }
    }
    else
    {
        try {
            Files.move(Paths.get(sourceFile.getPath()), Paths.get(destFile.getPath()), StandardCopyOption.REPLACE_EXISTING);
            return true;
        } catch (IOException e) {
            return false;
        }
    }
    return false;
}
4
flotothemoon

を使用してディレクトリを移動するだけです。

import static Java.nio.file.StandardCopyOption.*;

Files.move(new File("C:\\projects\\test").toPath(), new File("C:\\projects\\dirTest").toPath(), StandardCopyOption.REPLACE_EXISTING);

ソースパスと宛先パスを変更する

詳細については、 ここ を参照してください

APIからも注意

 When invoked to move a
     * directory that is not empty then the directory is moved if it does not
     * require moving the entries in the directory.  For example, renaming a
     * directory on the same {@link FileStore} will usually not require moving
     * the entries in the directory. When moving a directory requires that its
     * entries be moved then this method fails (by throwing an {@code
     * IOException}). To move a <i>file tree</i> may involve copying rather
     * than moving directories and this can be done using the {@link
     * #copy copy} method in conjunction with the {@link
     * #walkFileTree Files.walkFileTree} utility method

同じパーティションにファイルを移動しようとする場合、上記のコードで十分です(エントリがあってもディレクトリを移動できます)。そうでない場合(移動する代わりに)、他の回答で述べたように再帰を使用する必要があります。

10
Mani

Files.move() は、ファイルシステムがファイルを「移動」できる場合に機能します。これには通常、同じディスク上の別の場所に移動する必要があります。

7

インポートした場合 Apache Commons とにかく:

FileUtils.moveDirectory(oldDir, newDir);

newDirは事前に存在してはならないことに注意してください。 javadocsから:

public static void moveDirectory(File srcDir,
                                 File destDir)
                      throws IOException

ディレクトリを移動します。コピー先のディレクトリが別のファイルシステム上にある場合は、「コピーして削除」してください。

パラメーター:
srcDir-移動するディレクトリ
destDir-宛先ディレクトリ

スロー:
NullPointerException-ソースまたは宛先がnullの場合
FileExistsException-宛先ディレクトリが存在する場合
IOException-ソースまたは宛先が無効な場合
IOException-ファイルの移動中にIOエラーが発生した場合

3
Doopy

宛先パスのディレクトリが存在することを確認した後(たとえば、mkdirs()を呼び出すことにより)、renameToメソッド(JDKのFileクラスにすでに存在します)を使用する必要があります。 )。

1
Louis CAD

Javaには、ネイティブOS操作を使用して、 File.renameTo(File dest) にこれが組み込まれています。

例:

new File("/home/alik/Downloads/src").renameTo(new File("/home/alik/Downloads/target"))
0