いくつかのファイルを含む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を提供しますか、またはこのパスにのみすべてのファイルを再帰的にコピーする必要がありますか?
最善のアプローチは、おそらく次のような再帰的な方法です。これは、ファイルを一時フォルダーに移動するために作成した方法です。
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;
}
を使用してディレクトリを移動するだけです。
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
同じパーティションにファイルを移動しようとする場合、上記のコードで十分です(エントリがあってもディレクトリを移動できます)。そうでない場合(移動する代わりに)、他の回答で述べたように再帰を使用する必要があります。
Files.move()
は、ファイルシステムがファイルを「移動」できる場合に機能します。これには通常、同じディスク上の別の場所に移動する必要があります。
インポートした場合 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エラーが発生した場合
宛先パスのディレクトリが存在することを確認した後(たとえば、mkdirs()
を呼び出すことにより)、renameTo
メソッド(JDKのFile
クラスにすでに存在します)を使用する必要があります。 )。
Javaには、ネイティブOS操作を使用して、 File.renameTo(File dest) にこれが組み込まれています。
例:
new File("/home/alik/Downloads/src").renameTo(new File("/home/alik/Downloads/target"))